2017-12-19 3 views
3

を属性を取得するために私が選択的にカスタムアノテーションを使用してコントローラのサブセットによって使用されている春のControllerAdviceを定義することができます。どのようControllerAdviceクラスでControllerAdviceセレクタから

@RestController 
@UseAdviceA 
@RequestMapping("/myapi") 
class ApiController { 
... 
} 

@ControllerAdvice(annotations = UseAdviceA.class) 
class AdviceA { 

... 
} 

しかし、それは経由して、属性に渡すことができますアドバイスクラスが注釈からピックアップできるカスタム注釈?例えば用:

@RestController 
@UseAdviceA("my.value") 
@RequestMapping("/myapi") 
class ApiController { 
... 
} 

@ControllerAdvice(annotations = UseAdviceA.class) 
class AdviceA { 
// Some way to get the string "myvalue" from the instance of UseAdviceA 
... 
} 

あまりにも理解されるであろうControllerAdviceに渡すことができるコントローラ方法でカスタム構成を定義することができるようにされているのと同じ結果を達成するための他の方法。

答えて

1

ここに解決策があります。お使いのコントローラのアドバイスは

@ControllerAdvice(annotations = {UseAdviceA.class}) 
class AdviceA { 

    @ExceptionHandler({SomeException.class}) 
    public ResponseEntity<String> handleSomeException(SomeException pe, HandlerMethod handlerMethod) { 
    String value = handlerMethod.getMethod().getDeclaringClass().getAnnotation(UseAdviceA.class).myValue(); 
    //value will be ApiController 
    return new ResponseEntity<>("SomeString", HttpStatus.BAD_REQUEST); 
    } 
ようにする必要があり

@Target({ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface UseAdviceA { 
    public String myValue(); 
} 

コントローラ

@RestController 
@UseAdviceA(myValue = "ApiController") 
@RequestMapping("/myapi") 
class ApiController { 
... 
} 

考える

関連する問題