3

良い一日。

SpringでRESTクライアントを書いています。サーバーは、XML または JSON マーシャリングされたオブジェクトを応答として送信できます。通常のリクエスト/レスポンスの場合、正常に動作します。私の RestTemplate クライアントは、応答を非整列化できます。ただし、404 エラーの場合、サーバーはエラー記述子を XML/JSON として応答本文に送信します。

エラー リクエストの本文を非整列化する方法がわかりません。

これは私の REST クライアント コードです。

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

これはSpring構成のフラグメントです:

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

注: 通常、REST サーバーは XsdInfoType マーシャリングされたオブジェクトを送信します。ただし、エラー応答オブジェクトには他のタイプがあります。

4

1 に答える 1

1

の子に次のRestTemplateことができます。

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.
});
于 2013-08-13T15:12:44.780 に答える