我有一个带有java.util.Optional类型字段的DTO,如下所示:
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客户端发送它,服务器会抛出以下异常:
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
可以在jersey客户端使用java.util.Optional吗?
感谢。
答案 0 :(得分:3)
json不包含可选项,它包含一个long,因此您需要在Optional
中创建一个Long
:
@JsonCreator
public Person(@JsonProperty("id") Long id) {
this.id = Optional.ofNullable(id);
}
答案 1 :(得分:1)
将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));