如何从ControllerAdvice类

时间:2017-12-19 08:07:47

标签: java spring spring-mvc spring-boot

我可以使用自定义注释定义一个由控制器子集有选择地使用的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的自定义配置,也将非常感激。

1 个答案:

答案 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);
  }