Десериализация абстрактного свойства из тела запроса JSON на основе другого свойства из этого тела - PullRequest
0 голосов
/ 25 июня 2019

Как правильно десериализовать объект из 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]"

Как правильно достичь того, что мне нужно?

1 Ответ

0 голосов
/ 25 июня 2019

Оказывается, это была не проблема десериализации этого абстрактного свойства, а неизменяемых свойств, и @AllArgsConstructor Ломбока не очень хорошо работал с Джексоном.Я создал аннотированный конструктор @JsonCreator вместо аннотации, и теперь он работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...