首页 > 其他分享 >SpringBoot3特性——错误信息Problemdetails

SpringBoot3特性——错误信息Problemdetails

时间:2023-10-30 10:55:42浏览次数:38  
标签:tat java Problemdetails 错误信息 springframework SpringBoot3 apache org ApplicationF

Spring Framework 6 实现了 HTTP API 规范 RFC 7807 的问题详细信息。 在本文中,我们将学习如何在 SpringBoot 3 REST API(使用 Spring Framework 6)中处理异常,并使用 ProblemDetails API 提供错误响应。

详见
https://www.sivalabs.in/spring-boot-3-error-reporting-using-problem-details/

源码

WebMvcAutoConfiguration定义了错误处理的类

@Configuration(proxyBeanMethods = false)
//配置过一个属性 spring.mvc.problemdetails.enabled=true
@ConditionalOnProperty(prefix = "spring.mvc.problemdetails", name = "enabled", havingValue = "true")
static class ProblemDetailsErrorHandlingConfiguration {

    @Bean
    @ConditionalOnMissingBean(ResponseEntityExceptionHandler.class)
    ProblemDetailsExceptionHandler problemDetailsExceptionHandler() {
        return new ProblemDetailsExceptionHandler();
    }

}

ProblemDetailsExceptionHandler.java继承自ResponseEntityExceptionHandler,是一个 @ControllerAdvice集中处理系统异常

@ControllerAdvice
class ProblemDetailsExceptionHandler extends ResponseEntityExceptionHandler {

}

ResponseEntityExceptionHandler中可以处理以下异常。如果系统出现以下异常,会被SpringBoot支持以 RFC 7807规范方式返回错误数据。

	@ExceptionHandler({
			HttpRequestMethodNotSupportedException.class, //请求方式不支持
			HttpMediaTypeNotSupportedException.class,
			HttpMediaTypeNotAcceptableException.class,
			MissingPathVariableException.class,
			MissingServletRequestParameterException.class,
			MissingServletRequestPartException.class,
			ServletRequestBindingException.class,
			MethodArgumentNotValidException.class,
			NoHandlerFoundException.class,
			AsyncRequestTimeoutException.class,
			ErrorResponseException.class,
			ConversionNotSupportedException.class,
			TypeMismatchException.class,
			HttpMessageNotReadableException.class,
			HttpMessageNotWritableException.class,
			BindException.class
		})

开启RFC 7807问题详细信息支持

spring:
  mvc:
    problemdetails: # 是否启用RFC 7807问题详细信息支持 , 默认为false
      enabled: true

默认不开启时错误响应

响应头

Content-Type:application/json
{
    "timestamp": "2023-10-30T02:46:20.334+00:00",
    "status": 405,
    "error": "Method Not Allowed",
    "trace": "org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' is not supported\r\n\tat org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:265)\r\n\tat org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:441)\r\n\tat org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:382)\r\n\tat org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:126)\r\n\tat org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:68)\r\n\tat org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:505)\r\n\tat org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1275)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974)\r\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011)\r\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\r\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\r\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\r\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)\r\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)\r\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)\r\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)\r\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)\r\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\r\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\r\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\r\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)\r\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\r\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:340)\r\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391)\r\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\r\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)\r\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744)\r\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\r\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)\r\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\r\n\tat java.base/java.lang.Thread.run(Thread.java:833)\r\n",
    "message": "Method 'POST' is not supported.",
    "path": "/person"
}

开启后错误响应

响应头

Content-Type:application/problem+json
{
    "type": "about:blank",
    "title": "Method Not Allowed",
    "status": 405,
    "detail": "Method 'POST' is not supported.",
    "instance": "/person"
}

没时间进行研究,更多详见
https://www.sivalabs.in/spring-boot-3-error-reporting-using-problem-details/

标签:tat,java,Problemdetails,错误信息,springframework,SpringBoot3,apache,org,ApplicationF
From: https://www.cnblogs.com/zjw-blog/p/17797267.html

相关文章

  • 一篇了解springboot3请求参数种类及接口测试
    SpringBoot3数据请求:原始数据请求://原始方式@RequestMapping("/simpleParam")publicStringsimpleParam(HttpServletRequestrequest){//获取请求参数Stringname=request.getParameter("name");Stringage=request.getParame......
  • SpringBoot3-监听器
    SpringApplicationRunListener该监听器,监听SpringBoot应用的生命周期1.自定义SpringApplicationRunListener实现类在META-INF/spring.factories中配置org.springframework.boot.SpringApplicationRunListener=自己的Listener,还可以指定一个有参数构造器,接受两个参数(SpringA......
  • SpringBoot3.0 + RocketMq 构建企业级数据中台[内附资料]
    点击下载:SpringBoot3.0+RocketMq构建企业级数据中台[内附资料]  提取码:3cnfSpringBoot3.0是SpringBoot框架的最新版本,它提供了愈加简单、快速和高效的方式来构建企业级应用程序。RocketMq是一款高性能的音讯中间件,能够完成散布式音讯传送和处置。将SpringBoot3.0和Rocket......
  • Swagger系列:SpringBoot3.x中使用Knife4j
    目录一、简介二、版本说明三、使用四、效果图一、简介官网:https://doc.xiaominfo.com/Knife4j是一个集Swagger2和OpenAPI3为一体的增强解决方案Knife4j是为JavaMVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,致力于springfox-swagger......
  • ElasticSearch8.10.2接入SpringBoot3.+
    pom.xml文件引入依赖 <!--https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-client--> <dependency> <groupId>co.elastic.clients</groupId> <artifactId>elasticsearch-java</artifactId> &l......
  • Springboot3
    Java17以上1.依赖<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.0</version><relativePath/></parent>2.新特性2.1JakartaEE......
  • MYSQL 连接数据库过程中发生错误,检查服务器是否正常连接字符串是否正确,错误信息:未将对
    一:中文提示:连接数据库过程中发生错误,检查服务器是否正常连接字符串是否正确,错误信息:未将对象引用设置到对象的实例。DbType="MySql";ConfigId="".EnglishMessage:Connectionopenerror.未将对象引用设置到对象的实例。DbType="MySql";ConfigId="" 解决方法:在连接字......
  • 获得详细错误信息-windows核心编程
    windows程序员想要知道系统出错信息,一般使用GetLastError()来获取,该API获取的是错误码,如通过GetLastError返回123我们可以查询VS自带工具errorloop得到出错码123的错误信息:文件名、目录名或卷标语法不正确。这是一件挺麻烦的事。所以如果开发过程中我们能直接得到错误码的错误信息......
  • 快速搭建SpringBoot3.x项目
    写在前面上一小节中我们从0到1使用Vite搭建了一个Vue3项目,并集成了ElementPlus实现了一个简单的增删改查页面。这一篇中我们将使用IDEA快速搭建一个SpringBoot3.x的项目。一、创建项目1、File->new->project2、选择“SpringInitializr”,点击next;3、选择springboot版......
  • 安装CentOS7 解决错误信息:Warning: /deu/root does not exist Generating
    本文适用于错误信息"Warning:/deu/rootdoesnotexistGenerating"的一种情况不适用于错误信息"Warning:/dev/rootdoesnotexist,couldnotboot" 在给一台老旧的 DellR710安装CentOS7时发现的一个错误"Warning:/deu/rootdoesnotexistGenerating" 看了好......