核心依赖
- <!-- aop -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-aop</artifactId>
- <version>${springframework.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-aspects</artifactId>
- <version>${springframework.version}</version>
- </dependency>
- <!-- validator -->
- <dependency>
- <groupId>javax.validation</groupId>
- <artifactId>validation-api</artifactId>
- <version>1.1.0.Final</version>
- </dependency>
- <dependency>
- <groupId>org.hibernate</groupId>
- <artifactId>hibernate-validator</artifactId>
- <version>5.2.4.Final</version>
- </dependency>
验证工具类
- import com.google.common.base.Preconditions;
- import com.google.common.collect.Lists;
- import com.google.common.collect.Maps;
- import com.mmall.exception.ParamException;
- import org.apache.commons.collections.MapUtils;
- import javax.validation.ConstraintViolation;
- import javax.validation.Validation;
- import javax.validation.Validator;
- import javax.validation.ValidatorFactory;
- import java.util.Collection;
- import java.util.Collections;
- import java.util.Iterator;
- import java.util.LinkedHashMap;
- import java.util.Map;
- import java.util.Set;
- /**
- * 验证工具类
- * @author gaowenfeng
- */
- public class BeanValidator {
- private static ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
- /**
- * 验证单个对象
- * @param t
- * @param groups
- * @param <T>
- * @return
- */
- public static < T > Map < String,
- String > validate(T t, Class...groups) {
- Validator validator = validatorFactory.getValidator();
- Set validateResult = validator.validate(t, groups);
- if (validateResult.isEmpty()) {
- return Collections.emptyMap();
- } else {
- LinkedHashMap errors = Maps.newLinkedHashMap();
- Iterator iterator = validateResult.iterator();
- while (iterator.hasNext()) {
- ConstraintViolation violation = (ConstraintViolation) iterator.next();
- errors.put(violation.getPropertyPath().toString(), violation.getMessage());
- }
- return errors;
- }
- }
- /**
- * 验证一个集合
- * @param collection
- * @return
- */
- public static Map < String,
- String > validateList(Collection < ?>collection) {
- Preconditions.checkNotNull(collection);
- Iterator iterator = collection.iterator();
- Map errors;
- do {
- if (!iterator.hasNext()) {
- return Collections.emptyMap();
- }
- Object object = iterator.next();
- errors = validate(object, new Class[0]);
- } while ( errors . isEmpty ());
- return errors;
- }
- /**
- * 对 validate 和 validateList 的封装
- * @param first
- * @param objects
- * @return
- */
- public static Map < String,
- String > validateObject(Object first, Object...objects) {
- if (objects != null && objects.length > 0) {
- return validateList(Lists.asList(first, objects));
- } else {
- return validate(first, new Class[0]);
- }
- }
- /**
- * 校验逻辑
- * @param param
- * @throws ParamException
- */
- public static void check(Object param) throws ParamException {
- Map < String,
- String > map = BeanValidator.validateObject(param);
- if (MapUtils.isNotEmpty(map)) {
- throw new ParamException(map.toString());
- }
- }
- }
自定义注解
- import java.lang.annotation.*;
- @Target({ElementType.METHOD})
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- public @interface Check {
- // 需要验证的方法参数下标, 默认验证第一个参数
- int checkArgPosition() default 0;
- }
AOP 切面完成对注解方法的验证代理
- import com.mmall.util.BeanValidator;
- import lombok.extern.slf4j.Slf4j;
- 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.aspectj.lang.reflect.MethodSignature;
- import org.springframework.stereotype.Component;
- import java.lang.reflect.Method;
- /**
- * 验证切面
- * @author gaowenfeng
- */
- @Component
- @Aspect
- @Slf4j
- public class CheckAspect {
- /**
- * 切点
- */
- @Pointcut("@annotation(com.mmall.aop.Check)")
- public void checkPointCut(){}
- /**
- * 方法执行之前拦截
- * @param joinPoint
- */
- @Before("checkPointCut()")
- public void before(JoinPoint joinPoint){
- // 通过反射获取代理方法
- MethodSignature signature = (MethodSignature)joinPoint.getSignature();
- Method method = signature.getMethod();
- // 获取校验参数
- Check check = method.getAnnotation(Check.class);
- Object param = joinPoint.getArgs()[check.checkArgPosition()];
- // 校验
- BeanValidator.check(param);
- }
- }
AOP 配置
SpringMVC 配置, spring-mvc.xml 中加入如下配置
<aop:aspectj-autoproxy />
SpringBoot 及 无 XMLSpring 配置
- @Configuration
- @ComponentScan("xxxx")
- @EnableAspectJAutoProxy
- public class AopConfig {
- }
测试
- @Getter
- @Setter
- public class TestVo {
- @NotBlank
- private String msg;
- @NotNull(message = "id 不可以为空")
- @Max(value = 10, message = "id 不能大于 10")
- @Min(value = 0, message = "id 至少大于等于 0")
- private Integer id;
- private List<String> str;
- }
- @RequestMapping("/validate.json")
- @ResponseBody
- @Check()
- public JsonData validate(TestVo vo) throws ParamException {
- log.info("validate");
- SysAclModuleMapper moduleMapper = ApplicationContextHelper.popBean(SysAclModuleMapper.class);
- SysAclModule module = moduleMapper.selectByPrimaryKey(1);
- log.info(JsonMapper.obj2String(module));
- return JsonData.success("test validate");
- }
来源: http://www.jianshu.com/p/62cc224ff2d2