这个页面只需要:
to customize it just add a View that resolves to ‘error’
这句话讲的不是很明白,其实只要看ErrorMvcAutoConfiguration.WhitelabelErrorViewConfiguration的代码就知道,只需注册一个名字叫做error的View类型的Bean就行了。
本例的CustomDefaultErrorViewConfiguration注册将error页面改到了templates/custom-error-page/error.html上。
本章节代码在me.chanjar.boot.customdefaulterrorview,使用CustomDefaultErrorViewExample运行。
方法2
方法2比方法1简单很多,在Spring官方文档中没有说明。其实只需要提供error View所对应的页面文件即可。
比如在本例里,因为使用的是Thymeleaf模板引擎,所以在classpath /templates放一个自定义的error.html就能够自定义error页面了。
本章节就不提供代码了,有兴趣的你可以自己尝试。
自定义Error属性
前面看到了不论error页面还是error json,能够得到的属性就只有:timestamp、status、error、exception、message、trace、path。
如果你想自定义这些属性,可以如Spring Boot官方文档所说的:
simply add a bean of type ErrorAttributes to use the existing mechanism but replace the contents
在ErrorMvcAutoConfiguration.errorAttributes提供了DefaultErrorAttributes,我们也可以参照这个提供一个自己的CustomErrorAttributes覆盖掉它。
如果使用curl访问相关地址可以看到,返回的json里的出了修改过的属性,还有添加的属性:
{
"exception": "customized exception",
"add-attribute": "add-attribute",
"path": "customized path",
"trace": "customized trace",
"error": "customized error",
"message": "customized message",
"timestamp": 1498892609326,
"status": 100
}
本章节代码在me.chanjar.boot.customerrorattributes,使用CustomErrorAttributesExample运行。
自定义ErrorController
在前面提到了curl http://localhost:8080/return-text-plain得不到error信息,解决这个问题有两个关键点:
- 请求的时候指定Accept头,避免匹配到BasicErrorController.error方法。比如:curl -H ‘Accept: text/plain’ http://localhost:8080/return-text-plain
- 提供自定义的ErrorController。
下面将如何提供自定义的ErrorController。按照Spring Boot官方文档的说法:
To do that just extend BasicErrorController and add a public method with a @RequestMapping that has a produces attribute, and create a bean of your new type.
所以我们提供了一个CustomErrorController,并且通过CustomErrorControllerConfiguration将其注册为Bean。
本章节代码在me.chanjar.boot.customerrorcontroller,使用CustomErrorControllerExample运行。
ControllerAdvice定制特定异常返回结果
根据Spring Boot官方文档的例子,可以使用@ControllerAdvice和@ExceptionHandler对特定异常返回特定的结果。
我们在这里定义了一个新的异常:AnotherException,然后在BarControllerAdvice中对SomeException和AnotherException定义了不同的@ExceptionHandler:
- SomeException都返回到controlleradvice/some-ex-error.html上
- AnotherException统统返回JSON
在BarController中,所有*-a都抛出SomeException,所有*-b都抛出AnotherException。下面是用浏览器和curl访问的结果:
注意上方表格的Could not find acceptable representation错误,产生这个的原因和之前为何curl text/plain资源无法获得error是一样的:无法将@ExceptionHandler返回