Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用模块初始化Jersey客户端的正确方法是什么?_Java_Module_Jersey Client - Fatal编程技术网

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

Java 用模块初始化Jersey客户端的正确方法是什么?,java,module,jersey-client,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.

所以,这不应该这么难。我正试图让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
。很好,所以我们只需要在应用程序中安装该模块,一切正常。但是,如何

文档中没有提到这一点。我尝试了以下几行init代码的所有合理组合,但都没有成功:

    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 mapper=ObjectMapper() registerModule(JavaTimeModule())

(为kotlin道歉-如您所料翻译成Java)。

试试看 val mapper=ObjectMapper() registerModule(JavaTimeModule())

(为kotlin道歉——正如您所期望的那样翻译成Java)

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

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