zoukankan      html  css  js  c++  java
  • 关于@Valid 不生效的问题

    当在controller 中使用@Valid+ BindResult 和在参数实体中使用@NotNull,@NotEmpty等注解进行参数验证,

    最后通过接口调用却正常进入方法体内没有进行参数验证的情况,

    原因在于

    1:BindResult封装了参数验证抛出的异常,也就是说异常被抛出但异常被捕获到了,并被封装到BindResult中,因此方法会继续执行;

    2:我们另外写了统一异常处理类处理了异常

    解决方法:

    1:统一处理BindResult,打印出BindResult的信息;我的处理如下

    注意切面的位置和BindResult的位置

    package com.crm.admin.interceptor;
    
    import java.util.List;
    
    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.core.annotation.Order;
    import org.springframework.stereotype.Component;
    import org.springframework.validation.BindingResult;
    import org.springframework.validation.ObjectError;
    
    import com.crm.admin.exception.ParameterIllegalException;
    
    
    /**
     * 检查入参合法性
     */
    @Aspect
    @Component
    @Order(1)
    public class ValidParamAspect {
    
        // Controller层切点
        @Pointcut("execution (* com.crm.admin.controller..*.*(..))")
        public void aspect() { }
    
        @Before("aspect()")
        public void doBefore(JoinPoint jp) throws Throwable {
            Object[] args = jp.getArgs();
            if(args != null && args.length > 1 ) {
                //取出第2个参数
                Object obj = jp.getArgs()[1];
                if(obj instanceof BindingResult) {
                    BindingResult bindingResult = (BindingResult)obj;
                    // 校验返回错误集合中的第一个错误信息
                    if (bindingResult.hasErrors()) {
                        List<ObjectError> errors = bindingResult.getAllErrors();
                        throw new ParameterIllegalException(errors.get(0).getDefaultMessage());
                    }
                }
            }
        }
    
    }

    2:自行检查全局异常处理类的处理逻辑

  • 相关阅读:
    C#校验算法列举
    SuperSocket1.6电子书离线版
    C#检测系统是否激活[转自StackOverFlow]
    WSMBT Modbus & WSMBS Modbus 控件及注册机
    AU3获取系统激活信息
    JavaScript跨浏览器事件处理
    OAuth2的学习小结
    R学习日记——分解时间序列(季节性数据)
    R学习日记——分解时间序列(非季节性数据)
    Java内存分配原理
  • 原文地址:https://www.cnblogs.com/yunian139/p/11865151.html
Copyright © 2011-2022 走看看