默认行为
按照Spring Boot官方文档的说法:
For machine clients it will produce a JSON response with details of the error, the HTTP status and the exception message. For browser clients there is a ‘whitelabel’ error view that renders the same data in HTML format
也就是说,当产生异常时:
你可以在欣赏器中依次会见以下地点:
会发明FooController和FooRestController返回的功效都是一个Whitelabel Error Page也就是html。
可是假如你利用curl会见上述地点,那么返回的都是如下的json:
{ "timestamp": 1498886969426, "status": 500, "error": "Internal Server Error", "exception": "me.chanjar.exception.SomeException", "message": "...", "trace": "...", "path": "..." }
可是有一个URL除外:http://localhost:8080/return-text-plain,它不会返回任何功效,原因稍后会有说明。
本章节代码在me.chanjar.boot.def,利用DefaultExample运行。
留意:我们必需在application.properties添加server.error.include-stacktrace=always才气够获得stacktrace。
为何curl text/plain资源无法得到error
假如你在logback-spring.xml里一样设置了这么一段:
<logger name="org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod" level="TRACE"/>
那么你就能在日志文件里发明这么一个异常:
org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation ...
要领略这个异常是怎么来的,那我们来简朴阐明以下Spring MVC的处理惩罚进程:
那么为什么欣赏器会见http://localhost:8080/return-text-plain就可以呢?你只需打开欣赏器的开拓者模式看看请求头就会发明Accept:text/html,…,所以在第4步会匹配到BasicErrorController.errorHtml要领,那功效自然是没有问题了。
那么这个问题怎么办理呢?我会在自界说ErrorController里说明。
自界说Error页面
前面看到了,Spring Boot针对欣赏器提倡的请求的error页面是Whitelabel Error Page,下面讲授如何自界说error页面。
留意2:自界说Error页面不会影响machine客户端的输出功效
要领1
按照Spring Boot官方文档,假如想要定制这个页面只需要:
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官方文档所说的: