だからこそ、これは難しいことではありません。私は、java.time.LocalDateTime
をデシリアライズして、ジャージクライアントアプリケーションのObjectMapper
を取得しようとしています。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
をデシリアライズする適切な方法は何ですか?