SpringBoot 采用AOP的方式处理参数问题

  • 采用AOP的方式处理参数问题
  • 在类上使用 @Aspect 注解 使之成为切面类 
  • 在类上使用 @Component 注解 把切面类加入到IOC容器中
    ​
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.stereotype.Component;
    import org.springframework.validation.BindingResult;
    import org.springframework.validation.FieldError;
    import java.util.List;
    
    /**
     * 采用AOP的方式处理参数问题
     * 在类上使用 @Aspect 注解 使之成为切面类 
     * 在类上使用 @Component 注解 把切面类加入到IOC容器中
     * @author nql
     */
    @Component
    @Aspect
    public class BindingResultAop {
    	/**
    	 * Path=com.aop.controller
    	 * 设置切入点:Path为路径根据实际情况替换即可 
    	 */
    	@Pointcut("execution(* com.aop.controller..*.*(..))")
    	public void method() {
    	}
    
    	/**
    	 * 检查 Controller 方法的参数是否合法 环绕通知:目标方法执行前后分别执行一些代码,发生异常的时候执行另外一些代码
    	 * 
    	 * @param joinPoint
    	 * @return
    	 * @throws Throwable
    	 */
    	@Around("method()")
    	public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
    		BindingResult bindingResult = null;
    		for (Object arg : joinPoint.getArgs()) {// 遍历被通知方法(controller方法)的参数列表
    			if (arg instanceof BindingResult) {// 参数校验结果会存放在BindingResult中
    				bindingResult = (BindingResult) arg;
    			}
    		}
    		if (bindingResult != null) {
    			if (bindingResult.hasErrors()) {// 检查是否存在校验错误
    				List<FieldError> errors = bindingResult.getFieldErrors();// 获取字段参数不合法的错误集合
    				for (FieldError error : errors) {
    					ResultVO resultVO = new ResultVO();
    					resultVO.addArgs(error.getField() + " " + error.getDefaultMessage());
    					resultVO.setCode("SYS_PARAMETER_INVALID");
    					return resultVO;
    				}
    			}
    		}
    		return joinPoint.proceed();// 执行目标方法
    	}
    }
    
    ​

     

  • 实体类
    import java.io.Serializable;
    
    import javax.validation.constraints.NotNull;
    
    import com.qiruo.utils.validation.First;
    
    import lombok.Data;
    
    @Data
    public class EmailVo implements Serializable {
    	private static final long serialVersionUID = 1L;
    	/**
    	 * 用户id
    	 */
    	@NotNull(message = "用户ID不能为空", groups = {First.class})
    	private Integer userId;
    	/**
    	 * email地址
    	 */
    	@NotNull(message = "邮箱不能为空", groups = {First.class,Insert.class})
    	private String email;
    }
    

     

  • Controller层应用实例
    	@PostMapping(value = "/sendEmail")
    	public ResultVO<Map<String, Object>> sendEmail(@Validated({First.class}) @RequestBody EmailVo email, BindingResult bindingResult) throws Exception {
    		return questionsService.sendEmail(email);
    	}

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值