シナリオは次のとおりです。 Joda DateTime型をシリアル化および逆シリアル化できるJodaModuleを登録するObjectMapper(Jackson 2)があります。このObjectMapperはカスタムJSON文字列でテストされ、期待どおりに動作します。
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JodaModule());
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+1:00"));
objectMapper.setDateFormat(new ISO8601DateFormat());
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return objectMapper;
RestTemplateのインスタンス化を担当するRestTemplateFactoryがあり、以前に構成されたObjectMapper BeanをRestTemplateに設定します。
@Configuration
public class RestTemplateFactory {
@Autowired
private ObjectMapper objectMapper;
@Bean
public RestTemplate createRestTemplate() {
RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
MappingJackson2HttpMessageConverter jsonMessageConverter = new MappingJackson2HttpMessageConverter();
jsonMessageConverter.setObjectMapper(objectMapper);
messageConverters.add(jsonMessageConverter);
// restTemplate.setMessageConverters(messageConverters); // This line was missing, but needs to be here. See answer.
return restTemplate;
}
}
これで、Webサービスに連絡すると、次のエラーメッセージが表示されて、DateTimeオブジェクトの逆シリアル化に失敗します。
org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not instantiate value of type [simple type, class org.joda.time.DateTime] from String value; no single-String constructor/factory method
また、DateTimeDeserializer.classが呼び出されることはありません。誰かが私がここで欠けているものを知っていますか?
OK、createRestTemplate()メソッドにこの行がありませんでした。
restTemplate.setMessageConverters(messageConverters);
依存関係を追加
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
<version>2.9.0.pr4</version>
</dependency>
そして、以下のように逆シリアル化するためにDateTimeDeserializer.classを使用します
@JsonDeserialize(using = DateTimeDeserializer.class)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd.MM.yyyy", timezone = "Europe/Berlin")
private DateTime date;
私にとってはうまくいきます。カスタムメッセージコンバーターを追加する必要はありません。