2014-01-25 8 views
10

시나리오는 다음과 같습니다. JodaModule을 등록하는 ObjectMapper (Jackson 2)를 사용하여 Joda DateTime 유형을 직렬화 및 비 직렬화 할 수 있습니다. 이 ObjectMapper는 사용자 정의 JSON 문자열로 테스트되며 예상대로 작동합니다.Jackson을 HttpMessageConverter로 설정하고 joda DateTime 속성을 deserialize 할 수없는 Spring RestTemplate

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 있고, 그것은 RestTemplate에 이전에 구성된 ObjectMapper 빈을 설정합니다.

@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; 
    } 
} 

지금은 그것이 다음과 같은 오류 메시지가 해제 직렬화 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는 호출되지 않습니다를. 누구나 내가 여기에서 놓친 것을 생각할 수 있습니까?

답변

13

좋아,이 줄을 내 createRestTemplate() 메서드에서 누락되었습니다.

restTemplate.setMessageConverters(messageConverters); 
+1

혼란 스럽네요. 그 선은 원래 질문 이었나요? –

+0

원래 없었습니다. –

+1

아마도 원래 오류가 나타나면 안됩니다. 그냥 똑같은 짓을 했어 ;-) –

2

의존성을

 <dependency> 
     <groupId>com.fasterxml.jackson.datatype</groupId> 
     <artifactId>jackson-datatype-joda</artifactId> 
     <version>2.9.0.pr4</version> 
    </dependency> 

를 추가하고

@JsonDeserialize(using = DateTimeDeserializer.class) 
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd.MM.yyyy", timezone = "Europe/Berlin") 
private DateTime date; 

나를 위해 잘 작동 아래와 같이 직렬화 복원을 위해 DateTimeDeserializer.class를 사용합니다. 사용자 지정 메시지 변환기를 추가 할 필요가 없습니다.