我可以定义一个Spring 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 ... }
能够实现相同结果的任何其他方法,也就是能够在Controller方法中定义自定义配置的方法,都可以将其传递给ControllerAdvice,这一点也将不胜感激。
这是一个解决方案。 给定
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface UseAdviceA { public String myValue(); }
控制者
@RestController @UseAdviceA(myValue = "ApiController") @RequestMapping("/myapi") class ApiController { ... }
您的控制器建议应类似于
@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); }