zoukankan      html  css  js  c++  java
  • SpringMvc切面校验JavaBean及基础类型

    先配置好aop需要的配置,文:https://www.cnblogs.com/jiangxishicheng/p/10896498.html

    编写校验切面类:

    package com.aspect;/**
     * Description:
     *
     * @Author: dab0
     * Version: 1.0
     * Create Date Time: 2019/5/20 10:29
     * Update Date Time:
     * @see
     */
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    import org.aspectj.lang.reflect.MethodSignature;
    import org.hibernate.validator.internal.engine.path.PathImpl;
    import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
    import org.springframework.core.ParameterNameDiscoverer;
    import org.springframework.stereotype.Component;
    import org.springframework.validation.BeanPropertyBindingResult;
    import org.springframework.validation.ObjectError;
    
    import javax.validation.ConstraintViolation;
    import javax.validation.Validation;
    import javax.validation.ValidatorFactory;
    import javax.validation.executable.ExecutableValidator;
    import java.lang.reflect.Method;
    import java.util.List;
    import java.util.Set;
    
    /**
     * @author: dab0
     * @date:2019/5/20
     * @package:com.aspect
     **/
    @Component
    @Aspect
    public class ValidAspect {
        private ObjectError error;
    
        @Pointcut("execution(public * com.controller.*.*(..))")
        public void valid() {
    
        }
    
        /**
         * 环绕上面的valid方法切入的controller包下面的所有类方法
         * 环绕通知,环绕增强,相当于MethodInterceptor
         * @param pjp
         * @return
         */
        @Around("valid()")
        public Object around(ProceedingJoinPoint pjp) throws Throwable {
            System.out.println("方法环绕start......");
            Object[] objects = pjp.getArgs();
            System.out.println("------arg objects:" + objects);
            if (objects.length <= 0) {
                return pjp.proceed();
            }
    //        校验封装好的javabean
    //        寻找带BindingResult参数的方法,然后判断是否有error,如果有则是校验不通过
            for (Object object : objects) {
                if (object instanceof BeanPropertyBindingResult) {
                    BeanPropertyBindingResult result = (BeanPropertyBindingResult) object;
                    if (result.hasErrors()) {
                        List<ObjectError> errorList = result.getAllErrors();
                        for (ObjectError objectError : errorList) {
                            System.out.println(objectError.getCode() + ":" + objectError.getDefaultMessage());
                        }
    //                    返回第一条
                        return errorList.get(0).getDefaultMessage();
                    }
                }
            }
    
    //        校验普通类型参数
    //        //  获得切入目标对象
            Object target = pjp.getThis();
    //           获得切入的方法
            Method method = ((MethodSignature) pjp.getSignature()).getMethod();
    //        执行校验,获得校验结果
            Set<ConstraintViolation<Object>> validResult = validMethodParams(target, method, objects);
    //        如果有校验不通过的
            if (!validResult.isEmpty()) {
                // 获得方法的参数名称
                String[] parameterNames = parameterNameDiscoverer.getParameterNames(method);
                for (ConstraintViolation<Object> violation : validResult) {
    //                获得校验的参数路径信息
                    PathImpl pathImpl = (PathImpl) violation.getPropertyPath();
                    if (pathImpl == null) {
                        System.out.println("------sorry pathImpl is null.");
                    }
                    System.out.println("------pathImpl:" + pathImpl.getLeafNode());
    //                获得校验的参数位置
                    Integer paramIndex = pathImpl.getLeafNode().getParameterIndex();
                    if (paramIndex == null) {
                        System.out.println("------sorry paramIndex is null.");
                    }
    //                获得校验的参数名称
                    String paramName = parameterNames[paramIndex];
    
                    System.out.println("---------普通类型参数校验  参数名:" + paramName);
                    System.out.println("---------校验信息:" + violation.getMessage());
                }
    //            返回第一条
                return validResult.iterator().next().getMessage();
            }
            return null;
        }
    
    
    
        private ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();
        private final ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        private final ExecutableValidator validator = factory.getValidator().forExecutables();
    
    
        private <T> Set<ConstraintViolation<T>> validMethodParams(T obj, Method method, Object[] params) {
            return validator.validateParameters(obj, method, params);
        }
    
    }

    本文摘于: https://blog.csdn.net/tianyaleixiaowu/article/details/71173059

  • 相关阅读:
    并发编程与高并发学习笔记六
    并发编程与高并发学习笔记五
    并发编程与高并发学习笔记四
    浅谈数据挖掘与机器学习
    IntelliJ Idea常用的快捷键
    单链表的插入,查找,删除
    二叉树的序列化和反序列化及完全二叉树和满二叉树的区别
    二叉树的按层遍历并实现换行
    冒泡排序,选择排序,插入排序,快速排序的比较及优化
    axSpA患者新发炎症更容易发生在既往发生过炎症的区域
  • 原文地址:https://www.cnblogs.com/jiangxishicheng/p/10896644.html
Copyright © 2011-2022 走看看