SpringBoot 使用 ControllerAdvice 中的自定义错误处理所有错误

     2023-02-27     40

关键词:

【中文标题】SpringBoot 使用 ControllerAdvice 中的自定义错误处理所有错误【英文标题】:SpringBoot handle all errors with custom error in ControllerAdvice 【发布时间】:2020-10-27 12:13:07 【问题描述】:

我有一个 REST api spring boot 应用程序,想处理 ControllerAdvice 中的任何错误,因为我想有一个自定义的响应格式,而不是使用 Spring 默认响应。

例如,像 RequestRejectedException 这样的异常不是通过控制器建议处理的。有没有一种优雅的方法来处理 Spring 上的一个处理程序中的任何可能的错误?

对于 RequestRejectedException,我已经实现了 GenericFilterBean 并在那里重新格式化了响应,但希望有一种更统一的方式来处理所有错误。

【问题讨论】:

【参考方案1】:

使用 ControllerAdvice 类似:

@ControllerAdvice
class GenericExceptionHandling extends ResponseEntityExceptionHandler 

    @ExceptionHandler(value = RuntimeException.class)
    protected ResponseEntity<Object> handleConflict(
      RuntimeException ex, WebRequest request) 
        String bodyOfResponse = "This should be application specific";
        return handleExceptionInternal(ex, bodyOfResponse, 
          new HttpHeaders(), HttpStatus.CONFLICT, request);
    


应该是有道理的,但由于这个异常在 spring 抛出的方式不同,它似乎不能这样处理。阅读related。因此,处理此问题的一种方法是使用最高阶过滤器,并在该过滤器中捕获此异常并将响应转换为您想要的响应。

*** 相关线程:Spring 5.0.3 RequestRejectedException: The request was rejected because the URL was not normalized

【讨论】:

【参考方案2】:

Controller Advice 能够处理由控制器方法调用启动的任何流引发的任何异常。

这是“Spring MVC”处理异常的通用方式。

现在 Spring MVC 的基础架构在技术上基于单个 servlet(称为 DispatcherServlet),它可以通过 url、http 方法等将控制器方法“分配”给调用。

但是,您可以使用 Servlet 的过滤器,这些过滤器由底层 Web 容器(如 tomcat 或 jetty)直接部署和处理。因此,如果该代码引发了异常,它对于 Spring MVC 来说是“看不见的”,它甚至不会到达 MVC 控制器,因此控制器建议无法拦截异常。

您尚未指定确切源自 RequestRejectedException 的代码,但这可能是在 spring mvc 之外完成的,因此控制器建议不适用...

【讨论】:

取消当前的长手势来拖动视图?

...ragaview?【发布时间】:2016-12-2416:45:57【问题描述】:我有controllerA,我添加了一些UIView子类。这个视图里面有一个longpressgesture,所以当你长按它时,它会委托给controllerA。现在,当用户长按该视图时,我想通过添加到controllerA的pa... 查看详情

iOS:检测触地、segue、触地

...手指放在屏幕上。这会触发UITouchEvent,阶段Began,它调用controllerA中的touchesBegan:withEvent:方法,执行从controllerA到controllerB的segue。用户将手指从屏幕上移开。这会触发 查看详情

springboot使用之三:springboot使用logback日志

springboot默认使用的日志就是logback,所以使用logback不需要添加日志相关依赖了,执行添加logback.xml配置文件,springboot这个聪明的框架便能识处理你的配置。做法:将logback.xml放在resources下(classpath)下即可。配置参考如下:<?xm... 查看详情

springboot属性配置和使用

...就是可以通过配置文件来注入属性或者修改默认的配置。SpringBoot系列SpringBoot入门SpringBoot属性配置和使用SpringBoot集成MyBatisSpringBoot静态资源处理SpringBoot-配置排序依赖技巧SpringBoot-DevTools介绍SpringBoot支持 查看详情

springboot

参考:http://www.ityouknow.com/springboot(一):入门篇springboot(二):web综合开发springboot(三):SpringBoot中Redis的使用springboot(四):thymeleaf使用详解springboot(五):springdatajpa的使用springboot(六):如何优雅的使用mybatisspringboot(七):sp 查看详情

springboot(十八):使用springboot集成fastdfs

SpringBoot(十八):使用SpringBoot集成FastDFS环境:SpringBoot最新版本1.5.9、jdk使用1.8、tomcat8.0功能:使用SpringBoot将文件上传到分布式文件系统FastDFS中。一、pom包配置<dependency><groupId>org.csource</groupId><artifactId> 查看详情

springboot-使用listener

1、在SpringBoot中使用Listener1.1、使用注解注册Listener:/***SpringBoot使用Listener*/@WebListenerpublicclassOneListenerimplementsServletContextListener{@OverridepublicvoidcontextInitialized(ServletContextEventservlet 查看详情

springboot-使用filter

1、在SpringBoot中使用Filter1.1、使用注解注册Filter:/***SpringBoot使用Filter*/@WebFilter(filterName="OneFilter",urlPatterns="/one")publicclassOneFIlterimplementsFilter{@Overridepublicvoidinit(FilterConfigfilterConfi 查看详情

springboot使用maven创建springboot项目

 有两种方式可以创建 1是使用spring-boot-start-parent,2是使用spring-boot-dependencies(即父项目dependencyManagement)(同理springcloud 项目也可以使用两种方式创建,推荐使用dependencyManagement,后续笔记中补充)1.使用spring-boot-start-parent... 查看详情

springboot基础的使用

springboot的基础使用和内部原理高级使用整合进行web开发 springboot  看下spring的所有项目:https://spring.io/projects 等等就不一一介绍了 springboot就是整合spring的一系列技术栈进行简化企业级开发springboot自动配置好相... 查看详情

springboot参考教程springboot配置使用之配置类用法

4.2.SpringBoot配置使用之配置类使用SpringBoot的大部分自动配置都可以满足应用要求,但如果想精确的控制应用,或者想覆盖自动配置,使用配置类是另一种很好的选择,强调一下,SpringBoot主要使用配置文件和配置类来做配置。1.&nb... 查看详情

springboot参考教程springboot配置使用之配置文件用法

4.1SpringBoot配置使用之配置文件用法 SpringBoot旨在简化配置,但依然需要进行少量配置来满足应用的特定需要。配置方式抛弃了XML文件的配置方式,主要使用配置文件和配置类来实现自定义配置,但依然可以使用XML文件的方式... 查看详情

springboot(十六):使用jenkins部署springboot

SpringBoot(十六):使用Jenkins部署SpringBootjenkins是devops神器,介绍如何安装和使用jenkins部署SpringBoot项目jenkins搭建部署分为四个步骤;第一步,jenkins安装第二步,插件安装和配置第三步,PushSSH第四步,部署项目第一步,jenkins安装1... 查看详情

springboot2.0:使用docker部署springboot

...发展为微服务落地提供了更加便利的环境,使用Docker部署SpringBoot其实非常简单,这篇文章我们就来简单学习下。首先构建一个简单的SpringBoot项目,然后给项目添加Docker支持,最后对项目进行部署。一个简单SpringBoot项目在 pom... 查看详情

springboot2.0:使用docker部署springboot

...发展为微服务落地提供了更加便利的环境,使用Docker部署SpringBoot其实非常简单,这篇文章我们就来简单学习下。首先构建一个简单的SpringBoot项目,然后给项目添加Docker支持,最后对项目进行部署。一个简单SpringBoot项目在pom.xml... 查看详情

springboot.14.springboot使用jsp模板打包成jar

SpringBoot.14.SpringBoot使用jsp模板打包成jar前言实现步骤1.pom.xml2.打包3.上传至服务器4.运行5.测试前言关于SpringBoot使用jsp模板打包成jar的方式运行在文章SpringBoot.08.SpringBoot文件上传与下载中我们简单的提到过一次,这里我们来详... 查看详情

springboot使用·下篇(springboot集成mybatis+日志打印+mybatis-plus)(代码片段)

文章目录SpringBoot的使用SpringBoot集成MyBatis日志打印MyBatis-plus的简单搭建SpringBoot的使用我们在SpringBoot使用·上篇说到了SpringBoot注解、SpringBoot集成JDBC、SpringBoot集成druid(德鲁伊)数据源和sql监控,这篇文章我们会写到Sp... 查看详情

springboot的使用一

  springboot的使用一  springboot是spring社区比较新的一个项目,帮助开发者更容易使用spring应用,springboot能方便我们更快的进行spring的入门体验,这也是一种固定的,约定优于配置风格的框架。springboot基础知识:https://docs.spri... 查看详情