首页 文章

RestTemplate - 处理异常中的响应头/主体(RestClientException,HttpStatusCodeException)

提问于
浏览
22

在我的restful webservice中,如果出现错误请求(5xx)或4xx respose代码,我会在响应中写一个自定义 Headers “x-app-err-id” .

在客户端,我使用RestTemplate的交换方法来进行RestFul Web服务调用 . 当响应代码为2xx时,一切都很好 .

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

但是如果有异常(HttpStatusCodeException),因为它是一个错误的请求(5xx)或4xx,在HttpStatusCodeException的catch块中,我得到响应(见上文)为null,所以我没有访问我的自定义头我在我的网络服务中设置 . 如果RestTemplate中存在异常,如何从响应中获取自定义标头 .

还有一个问题是,我在错误的情况下在响应体中设置了一个错误对象(json),我想知道如何在RestTemplate中出现异常时访问响应体

2 回答

  • 31

    我终于使用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>
    
  • 12

    您不必创建自定义错误处理程序 . 您可以从被抛出的HttpStatusCodeException获取正文和 Headers .

    try {
        ResponseEntity<Component> response = restTemplate.exchange(webSvcURL,
            HttpMethod.POST, 
            requestEntity,
            Component.class);
    } catch (HttpStatusCodeException e) {
        List<String> customHeader = e.getResponseHeaders().get("x-app-err-id");
        String svcErrorMessageID = "";
        if (customHeader != null) {
            svcErrorMessageID = customHeader.get(0);                
        }
        throw new CustomException(e.getMessage(), e, svcErrorMessageID);
        // You can get the body too but you will have to deserialize it yourself
        // e.getResponseBodyAsByteArray()
        // e.getResponseBodyAsString()
    }
    

相关问题