我有一个RestEasyClient,它必须反序列化内部有一个java.time.Instant的对象。我尝试从jsr310注册新的jsr310,但仍然有错误:
ObjectMapper mapper = new ObjectMapper()
.registerModule(new JavaTimeModule());
ResteasyClient client = new ResteasyClientBuilder()
.register(mapper)
.build();
ResteasyWebTarget target = client.target(UriBuilder.fromPath(SERVICE_URL + "/api"));错误:
无法构造java.time.Instant实例:找不到合适的构造函数,不能从对象值反序列化(缺少默认构造函数或创建者,或者可能需要添加/启用类型信息?)
修改Rest服务器以正确序列化Instant类(ex:"fromTime":1525681860)
新错误:
无法构造java.time.Instant的实例:没有双/双参数构造函数/工厂方法从数字值反序列化(1.52568186E9)
我成功地模拟了这个:
ObjectMapper deserializer = new ObjectMapper()
.registerModule(new JavaTimeModule());
Instant probe = deserializer.readValue("1525681860", Instant.class);
System.out.println(probe);如果删除"registerModule“行,就会得到相同的错误。
因此,得出的结论是RestEasyClient没有注册该模块。我肯定做错了什么。
发布于 2018-05-07 11:13:49
您可以为ContextResolver定义一个ObjectMapper
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {
private final ObjectMapper mapper;
public ObjectMapperContextResolver() {
this.mapper = createObjectMapper();
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
private ObjectMapper createObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
return mapper;
}
}然后在客户端实例中注册解析器:
ResteasyClient client = new ResteasyClientBuilder()
.register(ObjectMapperContextResolver.class).build();或者,您可以注册一个JacksonJsonProvider实例。该类是将JSON内容绑定到和从Java对象绑定所需的JAX抽象(MessageBodyReader和MessageBodyWriter)的基本实现。
您可以使用接受构造函数实例的ObjectMapper。
https://stackoverflow.com/questions/50210846
复制相似问题