使用Spring AOP进行参数预校验

参考:https://blog.csdn.net/zyp112/article/details/79020231
背景:参数预校验,常用与对excel导入等,避免在程序中写入大量的判断,导致程序不够简洁。


方法一

在实现类方法中直接调用 ValidateUtil校验方法,下面工具类给出

方法二

结合AOP使用,只需要加注解,不用再在方法中调用ValidateUtil校验方法

1.定义一个用于方法上的注解类

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author Kevin
 *
  * 定义于方法,标注此方法的参数需要进行校验
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CheckParam {

}
2.利用注解定义切面

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import com.util.ValidateUtil;

/**
 * 
 * @author Kevin
 * 
 * @version 1.0.0
 * 
 * 2018-08-15   
 * 
 *  切面实现参数实体预校验,搭配hibernate注解
 * 此切面是扫注解的方法,也可以通过@Pointcut("execution(* *.saying(..))")表达式定义
 *
 */
@Aspect
@Component
public class ImportCheckAnnotationComponent {

    @Pointcut("@annotation(com.interceptor.annotation.CheckParam)")
    public void check(){}

    @Before("check()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        // 接收到请求,记录请求内容
        Object[] objs = joinPoint.getArgs();
        for(Object o : objs){
        	ValidateUtil.validate(o);
        }

    }
}

注意:
1.spring boot需要在启动Application类上加@EnableAspectJAutoProxy注解
2.spring xml则需要开启aop

<aop:aspectj-autoproxy/>
3.实体类上加注解,如判空等:

import javax.validation.constraints.NotBlank;

import lombok.Data;

/**
 * @author Kevin
 *
 */
@Data
public class NotNullBean {
	
	@NotBlank(message="姓名不能为空")
	private String name;
	@NotBlank(message = "年龄不能为空")
	private String age;
}
4.封装校验工具类,出自参考文档,感谢作者分享

import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.ValidationException;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

/**
 * @author Kevin
 * 
 * <a>https://blog.csdn.net/zyp112/article/details/79020231</a>
 *
 */
public class ValidateUtil {

	private static Validator validator;  

    static {  
        ValidatorFactory vf = Validation.buildDefaultValidatorFactory();  
        validator = vf.getValidator();  
    }

    public static <T> void validate(T t) throws ValidationException {
        Set<ConstraintViolation<T>> set = validator.validate(t);
        if (set.size() > 0) {
            StringBuilder validateError = new StringBuilder();
            for (ConstraintViolation<T> val : set) {
                validateError.append(val.getMessage() + " ;");
            }
            throw new ValidationException(validateError.toString());
        }
    }
}
5.写一个需要校验方法的类:
@Component
public class ServiceComponent {
	
	@CheckParam
	public void myanno(NotNullBean n) {
		
	}

}

启动项目,访问到调用这个方法的接口,然后控制台打印结果:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值