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

}

啓動項目,訪問到調用這個方法的接口,然後控制檯打印結果:
這裏寫圖片描述

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