java - 使用模块初始化 Jersey 客户端的正确方法是什么?

标签 java module jersey-client

所以,这不应该这么难。我试图在 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/

相关文章:

java - Maven 模块和依赖项 - 功能测试库

java - Selenium 没有使用 Chromedriver 通过 xpath 找到元素

java - 抛出 RecyclerView 后 layout_centerInParent 不工作

javascript - 使用 Node.js 导出模块时出错

java - 为什么包含 cxf-rt-rs-client 会破坏 jersey-media-json-processing

java - 删除向导请求响应日志记录

java - 如何禁用分块编码并为 Jersey 1 使用缓冲?

java - 检查数据库中重复记录的最佳方法| hibernate

java - 升级到2.7 ClassNotFoundException : org. mockito.exceptions.Reporter 运行测试后

javascript - ES6 模块导入和依赖管理