所以,这不应该这么难。我试图在 Jersey 客户端应用程序中使用 ObjectMapper
反序列化 java.time.LocalDateTime
。遗憾的是,这会导致异常:
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)
(对 kotlin 表示歉意 - 如您所料,转换为 Java)。
关于java - 使用模块初始化 Jersey 客户端的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44533106/