RestTemplate - Manipulation des en-têtes/du corps dans les Exceptions (RestClientException, HttpStatusCodeException)

dans mon webservice restful, en cas de mauvaise requête (5xx) ou de codes de réponse 4xx, j'écris un en-tête personnalisé "x-app-err-id" à la réponse.

côté client, j'utilise la méthode d'échange de RestTemplate pour faire un appel de service Web. Tout va bien quand le code de réponse est 2xx.

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

mais s'il y a une exception(HttpStatusCodeException) à cause d'une mauvaise requête (5xx) ou 4xx, dans le bloc catch de HttpStatusCodeException, j'obtiens la réponse(voir ci-dessus) comme nulle et donc je n'ai pas accès à mon en-tête personnalisé j'ai mis dans mon service web. Comment puis-je obtenir des en-têtes personnalisés à partir de la réponse en cas d'exceptions dans RestTemplate.

une autre question Est, je mets un objet d'erreur(JSON) dans le corps de réponse en cas d'erreur et je voudrais savoir comment accéder au corps de réponse aussi bien en cas d'exceptions dans RestTemplate

18
demandé sur Betlista 2011-10-24 19:26:35

2 réponses

Je l'ai finalement fait en utilisant 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);
    }
}

et ensuite utiliser ce gestionnaire de réponse personnalisé pour RestTemplate en configurant comme indiqué ci-dessous

<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>
30
répondu Chandra 2013-06-19 12:09:16

Vous ne devriez pas avoir à créer un gestionnaire d'erreur personnalisé. Vous pouvez obtenir le corps et les headers de la HttpStatusCodeException qui est lancé.

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()
}
10
répondu meustrus 2016-03-25 20:28:43