2017-06-13 2 views
1

Also, das sollte nicht so schwer sein. Ich versuche, eine ObjectMapper in einer Jersey-Client-Anwendung deserialize java.time.LocalDateTime zu haben. Leider führt diese Ausnahme:Was ist der richtige Weg, Jersey Client mit einem Modul zu initialisieren?

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?) 

Okay, so gibt es ein Modul, das den richtigen Serializer/Deserializer für den Java-Zeit-Typen implementiert: com.fasterxml.jackson.datatype.jsr310.JavaTimeModule. Großartig, also müssen wir nur dieses Modul in der Anwendung installieren, und alles ist gut. Aber wie?

Die Dokumentation ist eine Art Schweigen zu diesem Thema. Ich habe jede sinnvolle Kombination der folgenden Zeilen des init-Code versucht, ohne Erfolg:

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. 

Die ObjectMapper über einen separaten einen ist, um in meiner Anwendung jemand lag (für den Einsatz außerhalb des Kunden), und wird initialisiert mit:

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()); 

Es kann auch LocalDateTime nicht zuordnen.

Also, was ist der richtige Weg, um einen Jersey-Client zu konfigurieren, dieses Modul zu verwenden und deserialize java.time.LocalDateTime ??

Antwort

0

Versuchen val-Mapper = ObjectMapper() mapper.registerModule (JavaTimeModule())

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

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

(Apologies für die Kotlin - auf Java übersetzt, wie man erwarten würde).

Verwandte Themen