Джексон - @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;
}
}