• 关于@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:自行检查全局异常处理类的处理逻辑

  • 相关阅读:
    控件属性大全(持续更新)
    STM32F0使用LL库实现UART接收
    STM32F0 LL库IIC第二地址配置错误
    C# 抽象类小谈
    DevExpress 动态换肤
    DevExpress ChartControl大数据加载时有哪些性能优化方法
    Devexpress WPF ChartControl 多Y轴
    Lambda表达式的使用
    Prism--MVVM 之Command
    WPF Toolkit Chart--动态换列
  • 原文地址:https://www.cnblogs.com/yunian139/p/11865151.html
Copyright © 2020-2023  润新知