参考: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) {
}
}
启动项目,访问到调用这个方法的接口,然后控制台打印结果: