2016-12-05 13 views
3

私はレスポンスとしてXmlを返すREST APIメソッドを1つ持っています。簡単にするために単純な例外をスローすると仮定します。Spring mvc - XMLとJSONレスポンスのエラー処理のコンフィグレーション

@RequestMapping(value = "machine/xmlData", method = RequestMethod.GET, produces = "application/xml") 
    public ResponseEntity<String> getXml(HttpServletRequest request) 
      throws Exception { 
     return getDataFromService(); 

} 

ここでは、このようなRESTコントローラで例外を処理しています。 これは、一般的な例外のハンドル他のAPIメソッドのための方法、同様である(XMLまたはJSONレスポンス)

@ExceptionHandler(Exception.class) 
     @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) 
     public ResponseEntity HandleException(Exception ex, HttpServletRequest request) { 
      ex.printStackTrace(); 
      // here logic to generate Custom error Object 
      return new ResponseEntity<Object>(customErrorObject, HttpStatus.INTERNAL_SERVER_ERROR); 
     } 

ケース1:は受け入れる:「アプリケーション/ XML」とサービスから有効な応答を すべてが正常に動作します。

ケース2:受け入れ:HandleExceptionからResponseEntityがJSONであるため、サービス から "アプリケーション/ XML" と例外を、私は私の理解あたりとして406 Not Representable

を得ることが

で、受け入れるヘッダー は "application/xml"という理由で私が406になっているということです。

とにかく私はエラーを送信することができますxmlとjsonとしてHandleExceptionメソッドからの応答? REST APIメソッドでは、このようなものを定義できることがわかりましたproduces={"application/json","application/xml"} HandleExceptionメソッドにこれを入れるのが苦労しています。

ヒントがあれば助けになるはずです。

ありがとうございました。

+0

handleExceptionで@ResponseStatusを削除し、 – kuhajeyan

+0

@kuhajeyanを試してみてください。役に立たないです。私は – Roxy

答えて

1

@ResponseBody注釈(https://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc)を使用すると、spring-mvc HttpMessageConvertersを利用できます。この注釈は、特定の応答タイプに対して正しいmessageConverterを選択する責任があります。あなたが次のことを行う必要があり、XMLやJSON互換性があるためにあなたの応答を

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class WrappedExceptionResponse { 
    public String respone; 

    public String getRespone() { 
     return respone; 
    } 

    public void setRespone(String respone) { 
     this.respone = respone; 
    } 
} 

そして

@ExceptionHandler(Exception.class) 
    @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) 
    public @ResponseBody WrappedExceptionResponse HandleException(Exception ex, HttpServletRequest request) { 
//  ex.printStackTrace(); 
     // here logic to generate Custom error Object 
     WrappedExceptionResponse resp=new WrappedExceptionResponse(); 
     resp.setRespone(ex.getMessage()); 
    return resp; 

にあなたの例外ハンドラメソッドを変更してから例外応答が依存になりますあなたが与えるコンテンツタイプ。

+0

を試しましたが、その静的な、私はJSON MediaTypesのためにそれを使用することはできません。私はいくつかの一般的なエラー応答をしたいと思います。 – Roxy

+1

Eddited my answerがjsonとxmlの両方で期待どおりに機能するかどうか確認してください。 –

+0

それは役に立ちません。 @ResponseBodyは自動的に正しいコンバータを使用していません。 – Roxy