2017-10-12 7 views
-2

今、Spring 4で@ControllerAdviceを使用しています。*。 beforeBodyWriteメソッドを使用して を呼び出します。@ControllerAdviceでどのコントローラが呼び出されたのか分かりますか?

コントローラクラスでカスタムアノテーションを作成します。 @ControllerAdvice処理時にコントローラの情報を取得します。

コントローラクラスからのリクエストを知りたいです。

しかし、私は解決策を知りません。

助けてください?

おかげ

+0

達成しようとしていることsh? 'beforeBodyWrite()'は 'ResponseBodyAdvice'にあります。あなたはそこで実行されたコントローラを知りたいですか?もしそうなら、なぜですか? – Kayaman

+0

私はコントローラの注釈を知る必要があります。カスタムアノテーションクラスを作成し、コントローラクラスのメソッドレベルでアノテーションクラスを定義します。原因、私は、messageConverterの実行前に注釈でデータをリセットする必要があります。 –

+0

非常によく尋ねられない質問です。最初にこのページを読んでから質問を編集してください:https://stackoverflow.com/help/how-to-ask – Ibo

答えて

0

あなたの質問は、あなたが達成しているかの目的が何であるかを明確に述べるとせず、なぜあなたは私があなたの元を決定する方法を示すいくつかのガイドラインを投稿しますカスタムアノテーションを作成する必要がありますが、 ControllerAdvice

中にあなたRuntimeExceptionには、以下の残りのコントローラを考える:

@RestController 
public class CARestController { 
    @RequestMapping(value = "/test", method = RequestMethod.GET) 
    public String testException() { 
     throw new RuntimeException("This is the first exception"); 
    } 
} 

@RestController 
public class CAOtherRestController { 
    @RequestMapping(value = "/test-other", method = RequestMethod.GET) 
    public String testOtherException() { 
     throw new RuntimeException("This is the second exception"); 
    } 
} 

例外をスロー両方、我々は以下のを使用して、この例外をキャプチャすることができますを呼び出し、スタックトレースを使用して例外の起点を特定します。

Output of First Controller Output of second Controller

私の推薦ではなく、これを行う、あなたは例外の独自のセットを宣言し、その後でそれらをキャプチャすることです:

@ControllerAdvice 
public class CAControllerAdvice { 
    @ExceptionHandler(value = RuntimeException.class) 
    protected ResponseEntity<String> handleRestOfExceptions(RuntimeException ex) { 
     return ResponseEntity.badRequest().body(String.format("%s: %s", ex.getStackTrace()[0].getClassName(), ex.getMessage())); 
    } 
} 

これは、エンドポイントの出力がどのように見えるかですコントローラのアドバイス、投げられた場所の独立性:

public class MyExceptions extends RuntimeException { 
} 

public class WrongFieldException extends MyException { 
} 

public class NotFoundException extends MyException { 
} 

@ControllerAdvice 
public class CAControllerAdvice { 
    @ExceptionHandler(value = NotFoundException .class) 
    public ResponseEntity<String> handleNotFound() { 
     /**...**/ 
    } 
    @ExceptionHandler(value = WrongFieldException .class) 
    public ResponseEntity<String> handleWrongField() { 
     /**...**/ 
    } 
} 
+0

彼の 'RuntimeException'のソースは? – Kayaman

+0

ControllerAdviceは、チェックされていないRuntimeExceptionsを取得するために使用され、メソッド内で 'throws 'として宣言する必要はありません。答えを編集することはできますが、私の意見ではこの方法で行うのが良い方法です。 –

+0

例外処理は@ControllerAdvice'によく使われますが、それだけではありません。彼は例外について何も言わなかった。実際には、彼が何を言っているのか、それが '@ ControllerAdvice'と全く関係しているのかどうかは不明です... – Kayaman

関連する問題