Spring Boot中正确配置多个RestControllerAdvice的执行顺序
问题解答
1. 能否仅为DefaultExceptionHandler设置@Order,不为ValidationExceptionHandler设置?
不行。原因在于Spring中@Order注解的默认值是Ordered.LOWEST_PRECEDENCE(即Integer.MAX_VALUE),如果不给ValidationExceptionHandler指定@Order,它的优先级会和你设置了@Order(Ordered.LOWEST_PRECEDENCE)的DefaultExceptionHandler完全一致。此时Spring无法确定哪个处理器先执行,会按照Bean加载的随机顺序处理,自然无法保证ValidationExceptionHandler优先捕获异常——这就是你尝试后没生效的原因。
2. 是否必须为两个处理器都设置顺序?
严格来说不是“必须”,但你需要确保ValidationExceptionHandler的优先级数值小于DefaultExceptionHandler(因为@Order数值越小,优先级越高)。
比如:
- 给
ValidationExceptionHandler设置一个较小的数值(比如@Order(Ordered.HIGHEST_PRECEDENCE)或自定义的1),同时给DefaultExceptionHandler保持@Order(Ordered.LOWEST_PRECEDENCE); - 或者给
DefaultExceptionHandler设置一个较大的自定义数值(比如1000),给ValidationExceptionHandler设置更小的数值(比如1)。
只要两者的优先级数值有明确的大小差,就能保证顺序。但如果只给其中一个设置,另一个用默认值,大概率会出现优先级相同的情况,无法保证预期顺序。
3. 除了Ordered.LOWEST_PRECEDENCE,还有哪些方式配置低优先级?
- 直接用
@Order(Integer.MAX_VALUE):因为Ordered.LOWEST_PRECEDENCE的本质就是Integer.MAX_VALUE,两者完全等价; - 使用自定义的大数值:比如
@Order(1000)、@Order(9999)等,只要这个数值比其他处理器的@Order值大即可; - 如果使用Spring Boot 2.7+,也可以用
@Priority注解替代@Order,效果一致,设置@Priority(Integer.MAX_VALUE)也能实现低优先级。
另外,你提到@Order(Ordered.HIGHEST_PRECEDENCE)出现“冗余”警告,大概率是IDE的代码检查误判——因为你存在多个异常处理器,这个注解是有效且必要的,你可以忽略该警告,或者通过IDE配置关闭对应的检查规则。
内容的提问来源于stack exchange,提问作者user19601508
相关产品推荐
相关产品推荐

