利用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) {
		
	}

}

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章