我正在使用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。因此,帖子中所示的捕获物不会发生在我身上。
答案 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));