我可以使用自定义注释定义一个由控制器子集有选择地使用的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的自定义配置,也将非常感激。
答案 0 :(得分:1)
这是一个解决方案 鉴于
@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);
}