Как сопоставить java.util.Необязательно с клиентом джерси

#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, он уже создал эту конфигурацию. Спасибо.