1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > springboot+aop+自定义注解 打造通用的全局异常处理和参数校验切面(通用版)...

springboot+aop+自定义注解 打造通用的全局异常处理和参数校验切面(通用版)...

时间:2022-11-06 12:30:09

相关推荐

springboot+aop+自定义注解 打造通用的全局异常处理和参数校验切面(通用版)...

一.引入相应的maven依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

二.自定义参数校验注解

/*** @Author: guandezhi* @Date: /3/11 13:07*/@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface ParamValidate {String value() default "";}

三.自定义异常切面

package com.gdz.paramvalidate.aspect;import com.gdz.paramvalidate.annotation.ParamValidate;import lombok.extern.slf4j.Slf4j;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.reflect.MethodSignature;import org.ponent;import org.springframework.validation.BindingResult;import org.springframework.validation.FieldError;import org.springframework.validation.ObjectError;import java.lang.reflect.Method;import java.util.List;/*** 异常处理切面* @Author: guandezhi* @Date: /3/11 13:03*/@Slf4j@Aspect@Componentpublic class ExceptionAspect {@Before("@annotation(com.gdz.paramvalidate.annotation.ParamValidate)")public void before(JoinPoint jp) throws Exception {doBefore(jp);}private void doBefore(JoinPoint jp) throws Exception {if (getParamValidate(jp) == null) {return;}Object[] args = jp.getArgs();if (args == null) {return;}//将异常格式化成通用格式formateException(args); }private ParamValidate getParamValidate(JoinPoint jp) {MethodSignature methodSignature = (MethodSignature) jp.getSignature();Method method = methodSignature.getMethod();return method.getAnnotation(ParamValidate.class);}private void formateException(Object[] args) throws Exception {for (Object arg : args) {if (arg instanceof BindingResult) {BindingResult result = (BindingResult) arg;if (result != null && result.getErrorCount() > 0) {List<ObjectError> errors = result.getAllErrors();String errorMsg = "";for (ObjectError error : errors) {if (error instanceof FieldError) {FieldError fe = (FieldError) error;errorMsg = String.format("%s:%s", fe.getField(), error.getDefaultMessage());} else {errorMsg = String.format("%s:%s ", error.getCode(), error.getDefaultMessage());}log.error(errorMsg);throw new Exception(errorMsg);}}}}}}

四.自定义全局异常处理器

package com.gdz.paramvalidate.exception;import com.gdz.paramvalidate.bean.ResultVo;import lombok.extern.slf4j.Slf4j;import org.springframework.http.converter.HttpMessageNotReadableException;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.ResponseBody;/*** 全局异常处理** @Author: guandezhi* @Date: /3/11 14:43*/@Slf4j@ControllerAdvicepublic class GlobalExceptionHandler {@ResponseBody@ExceptionHandler(value = Exception.class)public ResultVo<Object> handleException(Exception e) {String errorMsg = "";if (e instanceof NullPointerException) {errorMsg = "参数空指针异常";} else if (e instanceof HttpMessageNotReadableException) {errorMsg = "请求参数匹配错误," + e.getLocalizedMessage();} else {errorMsg = e.getMessage();}log.error(String.format("请求异常[%s]", e));ResultVo<Object> resultVo = new ResultVo<>();resultVo.setResultCode("501");resultVo.setResultMsg(errorMsg);return resultVo;}}其中的resultVo如下:/*** @Author: guandezhi* @Date: /3/11 12:14*/@Datapublic class ResultVo<T> {private String resultCode;private String resultMsg;private T data;}

五.在需要校验入参的controller方法上加上自定义注(@ParamValidate)

/*** @Author: guandezhi* @Date: /3/11 12:15*/@Slf4j@RequestMapping("/user")@RestControllerpublic class UserController {@ParamValidate@RequestMapping("/addUser")public String addUser(@RequestBody @Valid User user, BindingResult result) throws Exception {int i = 1 / 0;return "success";}}

这里必须加上@ParamValidate@Valid这两个注解才能生效

其中User类如下:

/*** @Author: guandezhi* @Date: /3/11 12:19*/@Datapublic class User {@NotNull(message = "用户名不能为空")private String name;@NotNull(message = "手机号不能为空")private String mobile;}

六.测试一下

1.当入参为空值时

1.当程序有异常时

代码地址:/dezhiguan/GlobalExceptionHandler

---------------------

作者: guandezhi

来源:CSDN

原文:/qq_35859844/article/details/88394376

版权声明:本文为博主原创文章,转载请附上博文链接!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。