ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-05-16 14:44:50  阅读:374  来源: 互联网

标签:String 自定义 import springframework org 通用版 public errorMsg springboot


一.引入相应的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: 2019/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.springframework.stereotype.Component;
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: 2019/3/11 13:03
*/
@Slf4j
@Aspect
@Component
public 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: 2019/3/11 14:43
*/
@Slf4j
@ControllerAdvice
public 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: 2019/3/11 12:14
*/
@Data
public class ResultVo<T> {

private String resultCode;

private String resultMsg;

private T data;

}

  

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

/**
* @Author: guandezhi
* @Date: 2019/3/11 12:15
*/
@Slf4j
@RequestMapping("/user")
@RestController
public 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: 2019/3/11 12:19
*/
@Data
public class User {

@NotNull(message = "用户名不能为空")
private String name;

@NotNull(message = "手机号不能为空")
private String mobile;
}

  


六.测试一下

1.当入参为空值时

 

 

 
1.当程序有异常时

 

 

代码地址:https://github.com/dezhiguan/GlobalExceptionHandler
---------------------
作者: guandezhi
来源:CSDN
原文:https://blog.csdn.net/qq_35859844/article/details/88394376
版权声明:本文为博主原创文章,转载请附上博文链接!

标签:String,自定义,import,springframework,org,通用版,public,errorMsg,springboot
来源: https://www.cnblogs.com/telwanggs/p/10875498.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有