代码如下:
@SpringBootApplication public class App { public static void main( String[] args ) { SpringApplication.run(App.class, args); System.out.println("程序正在运行..."); } } 功能测试我们成功启动该程序之后,使用Postman工具来进行接口测试。
首先进行查询,查看程序正常运行是否ok,使用GET 方式进行请求。
GET :8181/api/user
返回参数为:
{"id":1,"name":"xuwujing","age":18}
示例图:
可以看到程序正常返回,并没有因自定义的全局异常而影响。
然后我们再来测试下自定义的异常是否能够被正确的捕获并处理。
使用POST方式进行请求
POST :8181/api/user
Body参数为:
{"id":1,"age":18}
返回参数为:
{"code":"-1","message":"用户姓名不能为空!","result":null}
示例图:
可以看出将我们抛出的异常进行数据封装,然后将异常返回出来。
然后我们再来测试下空指针异常是否能够被正确的捕获并处理。在自定义全局异常中,我们除了定义空指针的异常处理,也定义最高级别之一的Exception异常,那么这里发生了空指针异常之后,它是回优先使用哪一个呢?这里我们来测试下。
使用PUT方式进行请求。
PUT :8181/api/user
Body参数为:
{"id":1,"age":18}
返回参数为:
{"code":"400","message":"请求的数据格式不符!","result":null}
示例图:
我们可以看到这里的的确是返回空指针的异常护理,可以得出全局异常处理优先处理子类的异常。
那么我们在来试试未指定其异常的处理,看该异常是否能够被捕获。
使用DELETE方式进行请求。
DELETE :8181/api/user
Body参数为:
{"id":1}
返回参数为:
{"code":"500","message":"服务器内部错误!","result":null}
这里可以看到它使用了我们在自定义全局异常处理类中的Exception异常处理的方法。
到这里,测试就结束了。顺便再说一下,自义定全局异常处理除了可以处理上述的数据格式之外,也可以处理页面的跳转,只需在新增的异常方法的返回处理上填写该跳转的路径并不使用ResponseBody 注解即可。 细心的同学也许发现了在GlobalExceptionHandler类中使用的是ControllerAdvice注解,而非RestControllerAdvice注解,如果是用的RestControllerAdvice注解,它会将数据自动转换成JSON格式,这种于Controller和RestController类似,所以我们在使用全局异常处理的之后可以进行灵活的选择处理。
关于SpringBoot优雅的全局异常处理的文章就讲解到这里了,如有不妥,欢迎指正!
项目地址SpringBoot全局异常的处理项目工程地址:
https://github.com/xuwujing/springBoot-study/tree/master/springboot-exceptionHandler
SpringBoot整个集合的地址:
https://github.com/xuwujing/springBoot-study
SpringBoot配置文件的读取以及过滤器和拦截器的使用
SpringBoot的Restful风格的服务
SpringBoot+Mybatis+ Druid+PageHelper实现多数据源并分页
SpringBoot整合ElasticSearch实现多版本的兼容
SpringBoot整合Kafka和Storm
SpringBoot整合Jsp和Thymeleaf
SpringBoot整合Netty并使用Protobuf进行数据传输
SpringBoot简单打包部署
SpringBoot整合Redis使用Restful风格实现CRUD功能
音乐推荐