RestApi响应异常

时间:2016-09-09 15:22:08

标签: java spring

我正在使用RestTemplate来处理我们的服务和polycom rmx设备之间的通信,该设备的http api主要包括来回传输xml的post调用。问题出现时出现错误(即找不到的东西),它不会返回预期的响应,因此我收到错误

  

org.springframework.http.converter.HttpMessageNotReadableException:   无法解散[班级   com.ourclass.polycom.rmx.sdk.RESPONSETRANSRES]:意外   element(uri:“”,local:“RESPONSE_GENERAL”)。预期的要素是   < {}作用>,< {} ADDITIONAL_INFO>

因此,它要将错误对象反序列化为RESPONSETRANSRES,因为这是传入的内容(请参阅下面的代码),但由于错误响应,我们实际上得到了一个RESPONSEGENERAL对象,因此它不知道如何编组。

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

由于这是针对错误的情况,我宁愿捕获异常,获取有效负载并将其重新分析到我知道的对象中。这可能吗?怎么样?

我正在查看this SO答案,但e.getResponseBodyAsString();不是我的例外成员。可能还需要注意的是,当错误发生时,状态代码仍然是200 ok。因此,帖子中所示的捕获物不会发生在我身上。

1 个答案:

答案 0 :(得分:0)

不是最好的解决方案和一种黑客攻击 我把它作为一个字符串返回,而不是尝试手动编组它作为预期的响应,并在错误时将其作为另一个对象编组。

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