2017-06-13 74 views
1

所以,这不应该这么难。我试图在Jersey客户端应用程序中使用ObjectMapper反序列化java.time.LocalDateTime。可悲的是,这导致例外:用模块初始化Jersey客户端的正确方法是什么?

Exception in thread "main" javax.ws.rs.client.ResponseProcessingException: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of java.time.LocalDateTime: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?) 

好了,有一个实现为Java时间类型正确的串行/解串器模块:com.fasterxml.jackson.datatype.jsr310.JavaTimeModule。好极了,所以我们只需要在应用程序中安装该模块,一切都很好。但是,如何?

该文档对此有点沉默。我试过的初始化代码以下行的每一个明智的组合,没有运气:

ClientBuilder builder = ClientBuilder.newBuilder(); 
    builder.register(new RequestFilter(this)); 
    builder.register(new ResponseFilter(this)); 

    builder.register(new JacksonJsonProvider(objectMapper)); 
    builder.register(new JavaTimeModule()); 

    ClientConfig cc = new ClientConfig(); 
    cc.register(new JacksonJsonProvider(objectMapper)); 
    cc.register(new JavaTimeModule()); 
    // cc.getClasses().add(JavaTimeModule.class); // no go, this collection is unmodifiable 

    builder.register(cc); 

    // Client client = builder.build(); 
    Client client = builder.withConfig(cc).build(); 

    client.register(new JacksonJsonProvider(objectMapper)); 
    client.register(new JavaTimeModule()); 
    //client.getConfiguration().getClasses().add(JavaTimeModule.class); // and this one too. 

ObjectMapper上面是一个单独的一个在我的应用程序的人乱扔(使用客户端以外),并初始化为:

objectMapper = new ObjectMapper(); 
    objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 
    objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true); 
    objectMapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false); 
    objectMapper.registerModule(new JavaTimeModule()); 

它也不能映射LocalDateTime。

那么,配置Jersey客户端使用该模块并反序列化java.time.LocalDateTime的正确方法是什么?

回答

0

尝试 VAL映射器= ObjectMapper() mapper.registerModule(JavaTimeModule())

val provider = JacksonJaxbJsonProvider() 
provider.setMapper(mapper) 

val clientConfig = ClientConfig() 
clientConfig.register(provider) 

(很抱歉没能科特林 - 转换为Java如你所期望的那样)。

相关问题