spring boot 异常处理

spring boot中可以设置异常统一处理

 

一、单个controller中的异常处理

1.首先,需要写一个错误捕获方法

在这个异常方法中,可以使用logback等做日志记录,可以输出错误信息…总之,可以在这个方法中进行各种异常的处理

有@ExceptionHandler(RuntimeException.class)注解修饰,说明这是一个异常处理方法。一旦有RuntimeException运行时错误,就由这个方法进行处理。

比如说,如果找不到文件的错误想用这个自定义方法进行处理,就写个@ExceptionHandler(ClassNotFoundException.class)这样的注解就可以了。

2.需要制造一个错误

最终的controller:

testController.java

访问http://localhost:8080/test/testException时,返回

二、全局异常处理

1.写一个错误捕获类

注意,这里类的位置有讲究:

1

为什么会这样呢?这和spring boot扫描类的范围有关!

2.@SpringBootApplication扫描哪些包?

Spring Boot会自动扫描@SpringBootApplication所在类的同级包,以及下级包里的所有bean。所以建议入口类放在最外层的包名下。

也就是说,我这里的项目结构是不正确的。所以我调整了项目结构:

1

把这个启动类放在了根包下,方便扫描所有的bean。

springbootStarter.java

testController.java

这样才是正确的spring boot项目结构

访问http://localhost:8080/test/testException时,返回:

3.@ControllerAdvice注解的参数

看一下@ControllerAdvice这个注解,发现很多参数:value,basePackages,basePackageClasses,assignableTypes,annotations,说明可以控制这个错误类的范围,在这里我就不一一演示了。

4.错误捕获方法和错误捕获类覆盖的情况

如果上面的错误捕获类和错误捕获方法同时存在,那么哪个能捕获到错误呢?

我试验了一下,返回的是:

结论是:

同一个异常被小范围的异常处理器和大范围的异常处理器同时覆盖,会选择小范围的异常处理器。错误捕获是由范围决定的,范围小的优先级高,先来先得。

三、总结

感觉很简单直观,比Jersey中的那个错误处理机制方便多了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注