參考: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) {
}
}
啓動項目,訪問到調用這個方法的接口,然後控制檯打印結果: