用模块初始化Jersey客户端的正确方法是什么?
问题描述:
所以,这不应该这么难。我试图在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
的正确方法是什么?
答
尝试 VAL映射器= ObjectMapper() mapper.registerModule(JavaTimeModule())
val provider = JacksonJaxbJsonProvider()
provider.setMapper(mapper)
val clientConfig = ClientConfig()
clientConfig.register(provider)
(很抱歉没能科特林 - 转换为Java如你所期望的那样)。