2016-11-15 7 views
1

春のカスタム例外ハンドラを作成に関するいくつかのブログの記事を読んだ後、私は次のクラスを書いた:春ブートデフォルトの例外ハンドラ

@ControllerAdvice 
public class RestExceptionHandler extends ResponseEntityExceptionHandler { 
    @ExceptionHandler(value = Exception.class) 
    @ResponseBody 
    public ResponseEntity<Object> exceptionHandler(Exception e) { 
     HashMap<String, Object> msg = new HashMap<>(2); 
     msg.put("error", HttpStatus.PRECONDITION_FAILED.value()); 
     msg.put("message", "Something went wrong"); 
     return new ResponseEntity<>(msg, HttpStatus.BAD_REQUEST); 
    } 
} 

意図はなく配っのJSON応答でmsgを送信することです何らかの理由でスローされたものをSpring例外と呼びます。

このクラスは動作しません。

私がヒット、と言うと、私のサーバーAPIの無効なエンドポイント、私はデフォルトの応答ペイロードを取得:

{ 
    "timestamp": 1449238700342, 
    "status": 405, 
    "error": "Method Not Allowed", 
    "exception": "org.springframework.web.HttpRequestMethodNotSupportedException", 
    "message": "Request method 'POST' not supported", 
    "path": "/bad_enpoint" 
} 

私は何をしないのですか?

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

+0

「作業していません」ということを詳しく説明できますか?それは呼ばれませんか?それはしますが、失敗しますか? –

+0

私は質問で更なる情報を更新しました。それは呼び出されません、私はまだ春のexpectionが "露出"されている春のデフォルトのJSONを戻します – sargas

答えて

1

カスタムエラー応答にExceptionをマップするためにあなたのハンドラが呼び出されませんが、 Spring MVCにはすでに、Exceptionクラスに1つの例外ハンドラが登録されている可能性があります。それは確かにHttpRequestMethodNotSupportedExceptionを扱うものもあります。

しかし、すべてのSpring MVC例外処理/マッピングを上書きすることはお勧めできません。特定の例外、つまり定義した例外だけを気にする必要があります。

Spring MVC例外処理の詳細については、this articleをお読みください。

+1

記事のおかげで、私はSpring自身のハンドラを持つことができます。しかし、私はSpringがアプリケーションの内部についてあまりにも多くのことを "例外"のようなもので返すことであまりにも多くを払っているという事実は好きではありません: "org.springframework.web.HttpRequestMethodNotSupportedException"、 ' – sargas

+0

有効なポイント。 @OrderアノテーションにHIGHest PRECEDENCEを設定してみてください。この答えを見てください:http://stackoverflow.com/questions/19498378/setting-precedence-of-multiple-controlleradvice-exceptionhandlers –

+0

'@ Order'の使用へのこのリンクはまさに​​私が必要としていたものです。 – sargas

1
  1. ResponseEntityExceptionHandlerを拡張する必要はありません。
  2. 2つのHttpStatusesを設定することは悪い考えです。

@ControllerAdvice(私は、適切なフォーマットを持っているseparetlyそれを置くために持っている理由私は知らない)

public class RestExceptionHandler { 
    @ExceptionHandler(value = Exception.class) 
    @ResponseBody 
    public ResponseEntity<String> exceptionHandler(Exception e) { 
     return new ResponseEntity<>("Something went wrong", HttpStatus.BAD_REQUEST); 
    } 
} 
+0

私はまだ何かが間違っていたのと同じJSON応答を(私の質問の下を参照してください) ' – sargas

+0

' @ ControllerAdvice'はコントローラのアスペクトです。あなたのAJAX呼び出しはコントローラにも到達しませんでした。レスポンスから '/ bad_enpoint'コントローラにPOSTが実装されていないと思います。またはコントローラが全くありません。 –

+0

私は終点を定義する' @ RestController'クラスを持っています。 @RestControllerと@ControllerAdviceは同じクラスにアノテートされるべきですか? – sargas