关键词:
正常来说一个系统肯定有很多业务异常。而这些业务异常的信息如何返回给前台呈现给用户。比如用户的某些操作不被允许,需要给用户提示。
Spring 提供了@ControllerAdvice这个注解,这个注解可以实现全局异常处理,全局数据绑定,全局数据预处理,这里主要说下使用这个注解实现全局异常处理。
1.定义我们自己的业务异常ErrorCodeException
package com.nijunyang.exception.exception; /** * Description: * Created by nijunyang on 2019/12/20 9:36 */ public class ErrorCodeException extends RuntimeException private int code; /** * 用于填充资源文件中占位符 */ private Object[] args; public ErrorCodeException(int code, Object... args) this.code = code; this.args = args; public int getCode() return code; public Object[] getArgs() return args;
2.编写统一异常处理器RestExceptionHandler,使用@ControllerAdvice注解修饰,在异常处理器编写针对某个异常的处理方法,使用@ExceptionHandler注解指向某个指定异常。当代码中抛了该异常就会进入此方法执行,从而返回我们处理后的信息给请求者。
3.资源文件放置提示信息,根据错误码去匹配提示信息。
package com.nijunyang.exception.handler; import com.nijunyang.exception.exception.ErrorCodeException; import com.nijunyang.exception.model.RestErrorResponse; import com.nijunyang.exception.model.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import javax.annotation.Resource; import java.io.File; import java.io.IOException; import java.util.Locale; /** * Description: 控制层统一异常处理 * Created by nijunyang on 2019/12/20 9:33 */ @ControllerAdvice public class RestExceptionHandler @Autowired private MessageSource messageSource; //locale可以处理国际化资源文件,不同的语言 @ExceptionHandler(value = ErrorCodeException.class) public final ResponseEntity<RestErrorResponse> handleBadRequestException(ErrorCodeException errorCodeException, Locale locale) String message = messageSource.getMessage(String.valueOf(errorCodeException.getCode()), errorCodeException.getArgs(), locale); RestErrorResponse restErrorResponse = new RestErrorResponse(Status.FAILED, errorCodeException.getCode(), message); return new ResponseEntity<>(restErrorResponse, HttpStatus.OK);
4.配置文件指向资源文件位置(spring.messages.basename=xxx)
spring.messages.basename指向资源的前缀名字就行了,后面的国家语言标志不需要,Locale会根据系统的语言去识别,资源文件需要配置一个默认的(messages.properties),不然启动的时候可能无法正常注入资源,因为默认的是去加载不带国家语言标志的文件。
当然前缀随便配置什么都可以 只要再springboot的配置文件spring.messages.basename的路径配置正确就行,就像这样子也是可以的
5.控制层模拟异常抛出:
package com.nijunyang.exception.controller; import com.nijunyang.exception.exception.ErrorCodeException; import com.nijunyang.exception.model.ErrorCode; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * Description: * Created by nijunyang on 2019/12/20 9:58 */ @RestController @RequestMapping("/error") public class Controller @GetMapping("/file") public ResponseEntity test() //模拟文件不存在 String path = "a/b/c/d.txt"; throw new ErrorCodeException(ErrorCode.FILE_DOES_NOT_EXIST_51001, path);
6.前台调用结果
z/b/c/d.txt就去填充了资源文件中的占位符
错误码:
package com.nijunyang.exception.model; /** * Description: * Created by nijunyang on 2020/1/20 20:28 */ public final class ErrorCode public static int FILE_DOES_NOT_EXIST_51001 = 51001;
结果状态:
package com.nijunyang.exception.model; /** * Description: * Created by nijunyang on 2019/12/20 10:21 */ public enum Status SUCCESS, FAILED
异常统一结果返回对象
package com.nijunyang.exception.model; /** * Description: * Created by nijunyang on 2019/12/20 9:38 */ public class RestErrorResponse private Status status; /** * 错误码 */ private Integer errorCode; /** * 错误信息 */ private String errorMsg; public RestErrorResponse(Status status, Integer errorCode, String errorMsg) this.errorCode = errorCode; this.errorMsg = errorMsg; this.status = status; public Integer getErrorCode() return errorCode; public void setErrorCode(Integer errorCode) this.errorCode = errorCode; public String getErrorMsg() return errorMsg; public void setErrorMsg(String errorMsg) this.errorMsg = errorMsg; public Status getStatus() return status;
pom文件依赖:springBoot版本是2.1.7.RELEASE
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> </dependency> </dependencies>
完整代码:https://github.com/bluedarkni/study.git ---->springboot--->exception项目
@controlleradvice拦截异常并统一处理(代码片段)
在spring3.2中,新增了@ControllerAdvice注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。参考:@ControllerAdvice文档一、介绍创建MyControllerAdvice,并添加@ControllerAdvice注解。packagecom.sam 查看详情
自定义异常(代码片段)
在SpringBoot项目中,异常统一处理,可以使用Spring中@ControllerAdvice来统一处理,也可以自己来定义异常处理方案。SpringBoot中,对异常的处理有一些默认的策略,我们分别来看。默认情况下,SpringBoot中的异常页面是这样的:我们从... 查看详情
java项目构建基础之统一异常
统一异常处理@ControllerAdvice该注解为统一异常处理的核心是一种作用于控制层的切面通知(Advice),该注解能够将通用的@ExceptionHandler、@InitBinder和@ModelAttributes方法收集到一个类型,并应用到所有控制器上该类中的设计思路:使... 查看详情
Spring Boot @ControllerAdvice 部分工作,不适用于自定义异常
】SpringBoot@ControllerAdvice部分工作,不适用于自定义异常【英文标题】:SpringBoot@ControllerAdvicepartiallyworking,notworkingforcustomexception【发布时间】:2017-11-0601:24:57【问题描述】:我在SpringBoot1.5.3中使用@ControllerAdvice注释的ExceptionHandler遇... 查看详情
springboot中关于自定义异常处理的套路!
在SpringBoot项目中,异常统一处理,可以使用Spring中@ControllerAdvice来统一处理,也可以自己来定义异常处理方案。SpringBoot中,对异常的处理有一些默认的策略,我们分别来看。默认情况下,SpringBoot中的异常页面是这样的:我们从... 查看详情
@controlleradvice拦截异常并统一处理
SpringBoot系列(八)@ControllerAdvice拦截异常并统一处理https://www.cnblogs.com/magicalSam/p/7198420.htmlSpringMVC重要注解(二)@ControllerAdvicehttps://blog.csdn.net/w372426096/article/details/78429141 springboot(10)学习内容 查看详情
springboot(十九)@controlleradvice+@exceptionhandler全局捕获controller异常
在spring3.2中,新增了@ControllerAdvice注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。@ControllerAdvice官方文档。创建全局异常处理类:通过使用@ControllerAdvice定义统一的异常处理类,而不是在... 查看详情
@controlleradvice+@exceptionhandler全局处理controller层异常(代码片段)
...*环绕通知*切面:针对所有的controller中抛出的异常*若使用@ControllerAdvice,则不会自动转换为JSON格式*/@RestControllerAdvicepublicclassRestExceptionHandler/***业务异常处理*@parame*@returnErrorInfo*/@ExceptionHandler(BaseBusinessException.class)publicErrorInfoBusinessEx... 查看详情
springcloud-feign客户端统一处理下游服务自定义异常(1.5.x版本下可以)
...生成一个同样的异常对象,这样我们在上游业务就可以被controllerAdvice捕获到,从而达到统一异常处理的目的。 查看详情
restful接口调用统一异常处理(代码片段)
...,可对controller中被@RequestMapping注解的方法加一些逻辑处理@ControllerAdvice//异常定义@ExceptionHandler//返回格式为json,可以使用@RestControllerAdvice代替@ControllerAdvice,这样在方法上就可以不需要添加@ResponseBody@Respons 查看详情
springboot-@controlleradvice拦截异常并统一处理
SpringBoot是为了简化Spring应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个WEB工程 ... 查看详情
spring的@exceptionhandler和@controlleradvice统一处理异常
之前敲代码的时候,避免不了各种try..catch,如果业务复杂一点,就会发现全都是try…catchtry..........catch(Exception1e)..........catch(Exception2e)...........catch(Exception3e)...........这样其实代码既不简洁好看,我们敲着也烦,一般我们可能想到用... 查看详情
抛出异常时,Spring Boot 不显示自定义错误
...域相当陌生,我正在尝试在我的SpringBoot应用程序中使用@ControllerAdvice。ControllerAdvice捕获异常但不显示我的自定义响应。以下是引发异常的 查看详情
统一异常处理@controlleradvice+@exceptionhandler全局处理controller层异常(代码片段)
1.利用springmvc注解对Controller层异常全局处理对于与数据库相关的SpringMVC项目,我们通常会把事务配置在Service层,当数据库操作失败时让Service层抛出运行时异常,Spring事物管理器就会进行回滚。如此一来,我们的Controller层就不得... 查看详情
Spring ExceptionHandler 如何处理运行时异常
...间】:2016-04-2707:32:37【问题描述】:我正在使用spring的@ControllerAdvice和@ExceptionHandler进行异常处理。任何方法都会从Controller抛出自定义异常,并由相应的@ExceptionH 查看详情
springboot中controller的统一异常处理
...eb应用例子为基础,进行统一异常处理的改造。通过使用@ControllerAdvice定义统一的异常处理类,而不是在每个Controller中逐个定义。@ExceptionHandler用来定义函数针对的异常类型,最后将Exception对象和请求URL映射到error.html中。在templat... 查看详情
谷粒商城-品牌管理-统一异常处理(代码片段)
...异常处理类 对于项目中出现的异常,我们通常采用ControllerAdvice的方式进行统一处理,简化代码。1)、编写异常处理类,使用@ControllerAdvice。2)、使用@ExceptionHandler标注方法可以处理的异常。packagecom.xxh.... 查看详情
springcloudgateway-自定义异常处理(代码片段)
...的时候,只要是经过DispatcherServlet处理的请求,可以通过@ControllerAdvice和@ExceptionHandler自定义不同类型异常的处理逻辑,具体可以参考ResponseEntityExceptionHandler和DefaultHandlerExceptionResolver,底层原理很简单,就是发生异常的时候搜索... 查看详情