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

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

Ошибка определения типа: [простой тип, класс com.foo.command.FooCommand]; Вложенное исключение - com.fasterxml.jackson.databind.exc.InvalidDefinitionException: невозможно создать экземпляр com.foo.command.FooCommand (не существует создателей, как конструкция по умолчанию): не может десериализовать из значения объекта (не создатель на основе делегатов или свойств)

Вот 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, и он аннотирован для десериализации тела запроса автоматически в параметре контроллера. Возможно ли что-то подобное? Заранее спасибо.

1 ответ

У меня была аналогичная проблема, которую я исправил с помощью Converters: используя Jackson, как я могу десериализовать значения, используя статические фабричные методы, которые возвращают оболочки с универсальным типом?

Я еще не нашел, как применять преобразователи автоматически, поэтому вам нужно аннотировать каждое вхождение обернутого типа в ваших запросах.

      public class Request {
    @JsonDeserialize(converter = FooCommandConverter.class)
    Try<FooCommand> command;
}

Вы можете написать конвертер так:

      public class FooCommandConverter
        extends StdConverter<FooCommandConverter.DTO, Try<FooCommand>> {

    @Override
    public Try<FooCommand> convert(FooCommandConverter.DTO dto) {
        return FooCommand.of(
            dto.foo,
            dto.bar
        );
    }

    public static class DTO {
        public String foo;
        public String bar;
    }
}
Другие вопросы по тегам