30

私の安らかな Web サービスでは、不正なリクエスト (5xx) または 4xx レスポーズ コードの場合、カスタム ヘッダー "x-app-err-id" をレスポンスに書き込みます。

クライアント側では、RestTemplate の exchange メソッドを使用して、RestFul Web サービス呼び出しを行います。応答コードが 2xx であれば問題ありません。

ResponseEntity<Component> response = restTemplate.exchange(webSvcURL,
    HttpMethod.POST, 
    requestEntity,
    Component.class);

しかし、HttpStatusCodeException の catch ブロックで、不正なリクエスト (5xx) または 4xx であるために例外 (HttpStatusCodeException) が発生した場合、応答 (上記参照) を null として取得するため、カスタム ヘッダーにアクセスできません。私のWebサービスで設定します。RestTemplate で例外が発生した場合に応答からカスタム ヘッダーを取得するにはどうすればよいですか。

もう1つの質問は、エラーの場合に応答本文にエラーオブジェクト(json)を設定し、RestTemplateで例外が発生した場合に応答本文にアクセスする方法を知りたいです

4

3 に答える 3

32

私は最終的に ResponseErrorHandler を使用してそれを行いました。

public class CustomResponseErrorHandler implements ResponseErrorHandler {

    private static ILogger logger = Logger.getLogger(CustomResponseErrorHandler.class);

    private ResponseErrorHandler errorHandler = new DefaultResponseErrorHandler();

    public void handleError(ClientHttpResponse response) throws IOException {

        List<String> customHeader = response.getHeaders().get("x-app-err-id");

        String svcErrorMessageID = "";
        if (customHeader != null) {
            svcErrorMessageID = customHeader.get(0);                
        }

        try {           

            errorHandler.handleError(response);

        } catch (RestClientException scx) {         

            throw new CustomException(scx.getMessage(), scx, svcErrorMessageID);
        }
    }

    public boolean hasError(ClientHttpResponse response) throws IOException {
        return errorHandler.hasError(response);
    }
}

次に、以下に示すように構成して、RestTemplate にこのカスタム応答ハンドラーを使用します。

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
   <property name="messageConverters">
       <list>
           <ref bean="jsonConverter" />
       </list>
   </property>    
   <property name="errorHandler" ref="customErrorHandler" />
</bean>

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
   <property name="supportedMediaTypes" value="application/json" />
</bean>

<bean id="customErrorHandler " class="my.package.CustomResponseErrorHandler">
</bean>
于 2011-10-28T02:02:51.390 に答える