2013-06-21 4 views
2

안녕하세요.RestTemplate unmarshal errorBody

저는 Spring에서 REST 클라이언트를 작성하고 있습니다. 서버는 응답으로 XML 또는 JSON 마샬링 된 객체를 보낼 수 있습니다. 정상적인 요청/응답의 경우 잘 작동합니다. 내 RestTemplate 클라이언트는 응답을 언 마샬 할 수 있습니다. 그러나 404 오류의 경우 서버는 오류 설명자를 XML/JSON 형식의 응답 본문으로 보냅니다.

오류 요청 본문을 언 마샬하는 법을 모르겠습니다.

이 내 REST 클라이언트 코드 :

<bean id="objectMapper" 
     class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean" p:indentOutput="true" p:simpleDateFormat="yyyy-MM-dd'T'HH:mm:ss.SSSZ"> 
</bean> 
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" p:targetObject-ref="objectMapper" p:targetMethod="registerModule"> 
    <property name="arguments"> 
     <list> 
      <bean class="com.fasterxml.jackson.datatype.joda.JodaModule"/> 
     </list> 
    </property> 
</bean> 

<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"/> 
<bean id="jaxb2RootElementHttpMessageConverter" class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/> 
<bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
    <property name="objectMapper" ref="objectMapper"/> 
</bean> 
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" p:location="classpath:xsd-client.properties"/> 

<bean class="org.springframework.web.client.RestTemplate" id="xsdClientRestTemplate"> 
    <property name="messageConverters"> 
     <list> 
      <ref bean="mappingJackson2HttpMessageConverter"/> 
      <ref bean="jaxb2RootElementHttpMessageConverter"/> 
     </list> 
    </property> 
</bean> 

참고 :

@Service 
public class XsdClientImpl implements InitializingBean, XsdClient { 
    private static final Logger LOGGER = LoggerFactory.getLogger(XsdClientImpl.class); 
    @Autowired 
    @Qualifier("xsdClientRestTemplate") 
    private RestTemplate restTemplate; 
    private String baseUrl; 

    @Override 
    public XsdInfoType fetchNamespace(String namespace) throws XsdClientException { 
     Map<String, String> vars = Collections.singletonMap("namespace", namespace); 
     try { 
      return restTemplate.getForObject(baseUrl + "/xsd/get/{namespace}.xml", XsdInfoType.class, vars); 
     } catch (final HttpClientErrorException e) { 
      // e.getResponseBodyAsByteArray() how to unmarshall it? it can be XML or JSON 
      return null; 
     } 
    } 
} 

이 봄 설정의 조각이 정상적인 경우 REST 서버 전송 XsdInfoType 정렬 화 된 오브젝트합니다. 그러나 오류 응답 객체에는 다른 유형이 있습니다. RestTemplate의 하위 속으로

답변

1

우리가 할 수

HttpMessageConverterExtractor responseExtractor = new HttpMessageConverterExtractor<>(YourErrorType.class, getMessageConverters()); 
YourErrorType yet = (YourErrorType) responseExtractor.extractData(new ClientHttpResponse(e) { 
    // TODO Implement interface. It is very simple. 
    // You can get all data from the `e' variable. 
    // But I think the Spring has own implementation. 
});