Как правильно десериализовать объект из JSON (используя Джексона), когда у него есть абстрактное свойство, от которого конкретная реализация зависит от другого свойства из этого тела запроса?
Это, вероятно, лучше всего описано на примере.
Тело запроса для моей конечной точки REST включает в себя свойство, которое является абстрактным типом с несколькими конкретными реализациями, которые должны быть десериализованы на основе свойства discriminator
:
@Getter
@Builder
@AllArgsConstructor
public class SomeRequestBody {
@NotNull
@NotBlank
@NumberFormat
private final String discriminator;
@NotNull
private final SomeAbstractClass someAbstractClass;
}
Абстрактный класс в вопросе
@Getter
@AllArgsConstructor
public abstract class SomeAbstractClass{
@NotNull
@NotBlank
protected final String commonProperty;
}
Пример реализации абстрактного класса
@Getter
public class ConcreteImplementationA extends SomeAbstractClass {
@Builder
@JsonCreator
public ConcreteImplementationA(
@NotNull @NotBlank @JsonProperty("commonProperty") String commonProperty,
@NotNull @NotBlank @JsonProperty("specificProperty") Date specificProperty) {
super(commonProperty);
this.specificProperty = specificProperty;
}
@NotNull
@NotBlank
private final String specificProperty;
}
Что я пытался ...
@Getter
@Builder
@AllArgsConstructor
public class SomeRequestBody {
@NotNull
@NotBlank
@NumberFormat
private final String discriminator;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "discriminator")
@JsonSubTypes({
@JsonSubTypes.Type(value = ConcreteImplementationA.class, name = "1"),
Other implementations...)
})
@NotNull
private final SomeAbstractClass someAbstractClass;
}
Однако я получаю следующее исключение:
"Type definition error: [simple type, class abc.SomeRequestBody]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `abc.SomeRequestBody`, problem: Internal error: no creator index for property 'someAbstractClass' (of type com.fasterxml.jackson.databind.deser.impl.FieldProperty)\n at [Source: (PushbackInputStream); line: 8, column: 1]"
Как правильно достичь того, что мне нужно?