2016-09-09 16 views
0

Ich benutze RestTemplate, um die Kommunikation zwischen unserem Dienst und einem Polycom RMX-Gerät zu handhaben, das eine HTTP-API hat, die meistens aus Postanrufen besteht, die XML hin und her senden. Das Problem kommt, wenn ein Fehler aufgetreten ist (dh etwas nicht gefunden), wird es nicht die erwartete Antwort zurückgeben und so bekomme ich einen FehlerRestApi Ausnahme mit Antwort

org.springframework.http.converter.HttpMessageNotReadableException: kann nicht Abstellungs zu [Klasse com.ourclass.polycom.rmx.sdk.RESPONSETRANSRES]: unerwartet Element (uri: "", lokal: "RESPONSE_GENERAL"). Erwartete Elemente sind < {} ACTION>, < {} additional_info>

So sein Tring des Fehlerobjekt zu RESPONSETRANSRES deserialisieren, weil das ist, was in übergeben wurde (Code siehe unten), sondern wegen der Fehlerreaktion wir Sie erhalten tatsächlich ein RESPONSEGENERAL-Objekt und wissen daher nicht, wie man das stattdessen anordnet.

protected <Request, Response> Response doPost(String uri, Request data, Class<Response> responseClass) throws Exception 
    { 
     String requestUrl = null; 
     try 
     { 
      RestTemplate restApi = obtainRestTemlate(true); 
      ResponseEntity<Response> response = restApi.exchange(requestUrl, HttpMethod.POST, createRestRequest(HttpMethod.POST, uri, data), responseClass); 
      validateResponseStatus(response.getStatusCode()); 
      return response.getBody(); 
     } 
     catch (Exception e) 
     { 
      throw translateError(requestUrl, e); 
     } 
    } 

Da dies für einen Fehler Fall ist, würde ich es vorziehen, um die Ausnahme zu fangen, um die Nutzlast zu bekommen und Analysepunkte, es in das Objekt Ich weiß es zu sein. Ist das möglich und wie?

Ich schaute über this SO Antwort, aber e.getResponseBodyAsString(); ist kein Mitglied meiner Ausnahme. Es ist wahrscheinlich auch wichtig zu beachten, dass wenn die Fehler passieren, der Statuscode immer noch 200 ok ist. also würde der in der Post angegebene Fang nicht für mich passieren.

+0

Die REST-API bietet sowohl für die Fehlercodeebene als auch für die Statuscodeebene eine Fehlerbehandlung. Verweisen Sie dieses Beispiel zum Beispiel: http://howtodoinjava.com/jersey/jax-rs-jersey-custom-exceptions-handling-with-exceptionmapper/ – amitmah

Antwort

0

Nicht die beste Lösung und eine Art von Hack Ich machte es als String zurückgegeben als versuchen, es manuell als die erwartete Antwort zu marshalen und es als das andere Objekt zu marshalieren.

Class<?> requestClass = data.getClass(); 
    Method method = requestClass.getMethod("setTRANSCOMMONPARAMS", TransCommonParamsContent.class); 
    TransCommonParamsContent newTransCommonParams = new TransCommonParamsContent(); 
    newTransCommonParams.setMCUTOKEN(transCommonParamsContent.getMCUTOKEN()); 
    newTransCommonParams.setMCUUSERTOKEN(transCommonParamsContent.getMCUUSERTOKEN()); 
    method.invoke(data, newTransCommonParams); 

    String responseString = doPost(getBaseUri(), data, String.class); 
    try { 
     JAXBContext jaxbContext = JAXBContext.newInstance(responseClass); 
     Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
     @SuppressWarnings("unchecked") 
     Response response = (Response) unmarshaller.unmarshal(new StringReader(responseString)); 
     return response; 
    } catch (Exception e) { 
     JAXBContext jaxbContext = JAXBContext.newInstance(RESPONSEGENERAL.class); 
     Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
     RESPONSEGENERAL errorResponse = (RESPONSEGENERAL) unmarshaller.unmarshal(new StringReader(responseString)); 
Verwandte Themen