欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 宝鼎售后问题提交 | 后台管理


新闻资讯

MENU

软件开发知识

按照Spring Boot官方文档的说法: To do that just extend CAD加密 BasicErr

点击: 次  来源:劳务派遣管理系统 时间:2017-11-04

原文出处: chanjarster

默认行为

按照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

也就是说,当产生异常时:

  • 假如请求是从欣赏器发送出来的,昆山软件开发,那么返回一个Whitelabel Error Page
  • 假如请求是从machine客户端发送出来的,那么会返回沟通信息的json
  • 你可以在欣赏器中依次会见以下地点:

    1. http://localhost:8080/return-model-and-view
    2. http://localhost:8080/return-view-name
    3. http://localhost:8080/return-view
    4. http://localhost:8080/return-text-plain
    5. http://localhost:8080/return-json-1
    6. http://localhost:8080/return-json-2

    会发明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的处理惩罚进程:

    1. curl http://localhost:8080/return-text-plain,会隐含一个请求头Accept: */*,会匹配到FooController.returnTextPlain(produces=text/plain)要领,留意:假如请求头不是Accept: */*或Accept: text/plain,那么是匹配不到FooController.returnTextPlain的。
    2. RequestMappingHandlerMapping按照url匹配到了(见AbstractHandlerMethodMapping.lookupHandlerMethod#L341)FooController.returnTextPlan(produces=text/plain)。
    3. 要领抛出了异常,forward到/error。
    4. RequestMappingHandlerMapping按照url匹配到了(见AbstractHandlerMethodMapping.lookupHandlerMethod#L341)BasicErrorController的两个要领errorHtml(produces=text/html)和error(produces=null,相当于produces=*/*)。
    5. 因为请求头Accept: */*,所以会匹配error要领上(见AbstractHandlerMethodMapping#L352,RequestMappingInfo.compareTo,ProducesRequestCondition.compareTo)。
    6. error要领返回的是ResponseEntity<Map<String, Object>>,会被HttpEntityMethodProcessor.handleReturnValue处理惩罚。
    7. HttpEntityMethodProcessor进入AbstractMessageConverterMethodProcessor.writeWithMessageConverters,发明请求要求*/*(Accept: */*),而可以或许发生text/plain(FooController.returnTextPlan produces=text/plain),那它会去找可以或许将Map转换成String的HttpMessageConverter(text/plain代表String),功效是找不到。
    8. AbstractMessageConverterMethodProcessor抛出HttpMediaTypeNotAcceptableException。

    那么为什么欣赏器会见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官方文档所说的: