#java #json #jackson #jersey-2.0 #jersey-client
#java #json #джексон #джерси-2.0 #джерси-клиент
Вопрос:
У меня есть DTO с полем типа java.util.Необязательно, вот так:
public class Person {
private final Optional<Long> id;
@JsonCreator
public Person(@JsonProperty("id") Long id) {
this.id = id;
}
public Optional<Long> id {
return this.id
}
}
Если я попытаюсь сериализовать его в формате json и отправить его с помощью jersey client, сервер выдает исключение ниже:
com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class java.util.Optional<java.lang.Long>] from Integral number (1); no single-int-arg constructor/factory method
Можно использовать java.util.Необязательно с клиентом джерси?
Спасибо.
Ответ №1:
Json не содержит необязательного, он содержит long, поэтому вам нужно создать Optional
из Long
того, что вы получаете:
@JsonCreator
public Person(@JsonProperty("id") Long id) {
this.id = Optional.ofNullable(id);
}
Ответ №2:
Добавьте jackson-datatype-jdk8
зависимость в свой pom.xml
:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
<version>2.6.3</version>
</dependency>
Создайте ObjectMapper
экземпляр и зарегистрируйте Jdk8Module
:
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new Jdk8Module());
А затем зарегистрируйте JacksonJsonProvider
в своем Client
экземпляре:
Client client = ClientBuilder.newClient().register(new JacksonJsonProvider(mapper));
Комментарии:
1. Мы используем фреймворк drowizard, он уже создал эту конфигурацию. Спасибо.