Джексон - @JsonCreator возвращает дженерики

Я хочу интегрировать библиотеку проверки vavr в свою команду dto таким образом, чтобы при десериализации команды dto из запроса типом возвращаемого значения статической фабрики было Try, но Джексон выдает следующую ошибку:

Type definition error: [simple type, class com.foo.command.FooCommand]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.foo.command.FooCommand (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

Вот FooCommand

@AllArgsConstructor(access = AccessLevel.PRIVATE)
public final class FooCommand {
    private String foo;
    private String bar;

    @JsonCreator
    public static Try<FooCommand> of(
            @JsonProperty("foo") String foo,
            @JsonProperty("bar") String bar
    ) {
        return Try.of(() -> {
            //Validate values
        });
    }
}

Я использую Spring 5, и он помечен для автоматической десериализации тела запроса в параметр контроллера. Возможно ли что-то подобное? Заранее спасибо.

Как выглядит FooCommand? Класс в вашем вопросе - RegisterConfiguration, но возвращаемое значение - Try<FooCommand>.

PolygonParrot 24.12.2018 23:18

Я исправил имя класса в примере на FooCommand. Спасибо, что указали на это.

user3018350 24.12.2018 23:25

Я думаю, вам стоит создать конструктор и поставить @JsonCreator поверх конструктора

Mohsen 24.12.2018 23:27

Как тогда будет вызываться метод FooCommand :: of ()?

user3018350 24.12.2018 23:30

@SilvioMarijic I am using spring 5 and it's annotated to deserialize request body automatically Думаю, Spring это называет.

PolygonParrot 24.12.2018 23:39

Похоже, что Джексон использует фабричные методы только в том случае, если они имеют один и тот же возвращаемый тип, даже если они получили аннотацию @JsonCreator.

PolygonParrot 25.12.2018 00:13

Да, это странно, я понятия не имею, почему это ограничение на тип возвращаемого значения. Все работает нормально, когда я просто возвращаю экземпляр FooCommand, не помещая его в Try

user3018350 25.12.2018 01:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
606
0

Другие вопросы по теме