如何使用jersey客户端映射java.util.Optional

时间:2016-10-14 08:14:22

标签: java json jackson jersey-2.0 jersey-client

我有一个带有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吗?

感谢。

2 个答案:

答案 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));