Десериализация с помощью Джексона (сбой при неизвестных свойствах) не игнорирует свойство дискриминатора (DTO создано с JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Десериализация с помощью Джексона (сбой при неизвестных свойствах) не игнорирует свойство дискриминатора (DTO создано с

Сообщение Anonymous »

РЕДАКТИРОВАТЬ:

Я обнаружил проблему: мне нужно найти способ заставить Swagger Codegen удалить часть "visible = true", когда он генерирует класс Java. Если я удалю это вручную, это сработает. Проблема в том, что классы генерируются во время компиляции, и эта модификация будет переопределена.

Все еще нужна помощь!

Первое сообщение:

У меня есть следующее:
  • Класс сущности приема, имеющий список. Checkpoint — это базовый класс, но он будет содержать только подклассы, такие как Checkpoint1, Checkpoint2 и т. д.
  • ReceptionCotroller, у которого есть метод HTTP POST, сопоставленный с помощью «/receptions».
  • Классы DTO для приема и контрольных точек (базовый класс Checkpoint, Checkpoint1, Checkpoint2 и т. д.), созданные с помощью Swagger CodeGen openapi 3.0.2. используя файл yml. DTO Checkpoint имеет поле дискриминатора (в файле yml) с именем «dtype», поэтому при десериализации JSON в Checkpoint он знает, к какому подклассу он относится.
Проблема в том, что когда я добавляю свойство: Spring.jackson.deserialization.fail-on-unknown-properties = true, оно не распознает свойство «dtype» и происходит сбой. Я хочу, чтобы приложение завершало работу при обнаружении неизвестных свойств, но игнорировало "dtype".

Я пытался добавить поле dtype (рядом с определением дискриминатора) в Checkpoint DTO, но затем JSON, который возвращается в качестве ответа, имеет 2 поля dtype (одно со значением дискриминатора и одно с нулевым значением).

Прием и контрольная точка в файле yml:

Код: Выделить всё

Reception:
description: description1
type: object
properties:
id:
type: integer
format: int64
description: Id of the reception.
checkpoints:
type: array
items:
oneOf:
- $ref: '#/components/schemas/Checkpoint1'
- $ref: '#/components/schemas/Checkpoint2'
discriminator:
propertyName: dtype
$ref: '#/components/schemas/Checkpoint'
description: List of checkpoints attached to this reception.

Код: Выделить всё

Checkpoint:
description: Checkpoint entity.
type: object
properties:
checkpointId:
type: string
description: description1.
required:
- checkpointId
- dtype
discriminator:
propertyName: dtype
Созданный класс DTO Checkpoint:

Код: Выделить всё

@ApiModel(description = "Checkpoint entity.")
@Validated
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "dtype", visible = true )
@JsonSubTypes({
@JsonSubTypes.Type(value = Checkpoint1.class, name = "Checkpoint1"),
@JsonSubTypes.Type(value = Checkpoint2.class, name = "Checkpoint2")
})
public class Checkpoint   {
@JsonProperty("dtype")
private String dtype = null;

@JsonProperty("checkpointId")
private String checkpointId = null;

(.....)
Json отправлен как тело запроса:

Код: Выделить всё

{
"id": 123,
"checkpoints": [
{
"dtype": "Checkpoint1",
"checkpointId": "Checkpoint1"
}
}
Он говорит, что не распознает поле dtype. Я хочу, чтобы он создал соответствующий объект Checkpoint, но игнорирую тот факт, что DTO Checkpoint фактически не содержит поля dtype в сгенерированном классе. Я НЕ хочу, чтобы он игнорировал ДРУГИЕ неизвестные свойства. Например: если я добавлю еще одно поле «fooBar» в JSON, я хочу, чтобы он потерпел неудачу.

Надеюсь, предоставленная информация позволяет понять, в чем моя проблема. Если нет, я могу предоставить дополнительную информацию.

Заранее большое спасибо!
PS: Пожалуйста, игнорируйте возможные синтаксические ошибки или опечатки, код работает и копируется правильно, но я не знаю, как игнорировать ТОЛЬКО свойство дискриминатора (dtype).

Подробнее здесь: https://stackoverflow.com/questions/572 ... e-discrimi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»