2016-09-09 7 views
0

私たちはサービスと、xmlを前後に送信するポストコールで構成されたhttp APIを持つポリコムrmxデバイスとの間の通信を処理するためにRestTemplateを使用しています。 がにアンマーシャリングできませんでした。この問題は、エラー(つまり、何かが見つからない)があるとき、それは予想される応答を返さないので、私はエラーレスポンス付きrestApi例外

org.springframework.http.converter.HttpMessageNotReadableExceptionを取得しています[クラス com.ourclass.polycom.rmx.sdk.RESPONSETRANSRES]:予期しない 要素(uri: ""、ローカル: "RESPONSE_GENERAL")。予想される要素である < {} ACTION>、< {} ADDITIONAL_INFO>

ように、その中に渡されたものthatsは(以下のコードを参照)ので、しかしため、エラー応答の、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を見ていましたが、e.getResponseBodyAsString();は私の例外のメンバーではありません。おそらく、エラーが発生したときにステータスコードがまだ200 OKであることに注意することも重要です。投稿に表示されたキャッチは私にとっては起こりません。

+0

REST APIは、エラーコードレベルとステータスコードレベルの両方でエラー処理を提供します。この例を参照してください:http://howtodoinjava.com/jersey/jax-rs-jersey-custom-exceptions-handling-with-exceptionmapper/ – amitmah

答えて

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)); 
関連する問題