多个RestControllerAdvice
存在多个@RestControllerAdvice,且未使用@Order注解声明使用顺序时,实际运行会有Advice乱序的问题(就是同一个异常在不同机器上使用的Advice可能是不一样的)。为避免此乱序问题应使用@Order来指定优先级(也可把controller和advice分成多组,同组的放到同一个包下,不同组的反之)
举例
同时存在AaaHandlerAdvice、BbbHandlerAdvice 且包名都是【com.test.controller】
而ConfigController的包名也是【com.test.controller】或它的子包,这时候Advice会有乱序的问题,同一个异常在不同机器上使用的Advice可能是不一样的,如此响应status code有两种可能:
【AaaHandlerAdvice】时:200
【BbbHandlerAdvice】时:500
@RestControllerAdvice(basePackageClasses = {ConfigController.class})
public class AaaHandlerAdvice {
@ExceptionHandler(value = {Exception.class})
@ResponseStatus(HttpStatus.OK)
public Result handler(Exception ex) {
return Result.fail(ex);
}
}
@RestControllerAdvice(basePackages = {"com.test.controller"})
public class BbbHandlerAdvice {
@ExceptionHandler(value = {Exception.class})
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public Result handler(Exception ex) {
return Result.fail(ex);
}
}
另需注意:
@RestControllerAdvice的属性basePackageClasses也是扫包的(包含子包),等价于basePackage。而非惯性思维的仅处理类自身的异常。