zoukankan      html  css  js  c++  java
  • JSR303校验的基本使用和结合AOP使用

    [一]:基本使用

    springboot默认导入第三方校验框架hibernate-validator

    使用JSR303三大步骤

    一.先给需要校验数据的javabean上标注校验注解

    public class UmsAdminParam {
        @ApiModelProperty(value = "用户名", required = true)
        @Length(min = 6,max = 20,message = "用户名长度必须是6-18位")
        private String username;
        @ApiModelProperty(value = "密码", required = true)
        @NotEmpty(message = "密码不能为空")
        private String password;
        @ApiModelProperty(value = "用户头像")
        private String icon;
        @ApiModelProperty(value = "邮箱")
        @Email(message = "邮箱格式不合法")
        private String email;
        @ApiModelProperty(value = "用户昵称")
        private String nickName;
        @ApiModelProperty(value = "备注")
        private String note;
    }
    

     能使用的校验注解:

    1.在hibernate-vaidator包下自带的注解:org.hibernate.validator.constraints下面所有注解

     2.JSR303钟规定的注解 :javax.validation.constraints下所有的注解

     二.告诉springboot,需要校验

    在方法中加上@Valid注解

    springmvc进入方法之前,确定参数值的时候就会校验,如果校验出错,直接返回错误不执行controller代码

     三.感知校验成功还是失败

    在开启了校验javaBean参数后面,紧跟一个BindingResult对象,就可以获取到校验结果

    只要有BindingResult,即使校验没通过,方法也会执行,我们需要手动处理。

     测试结果:

    [二]:结合AOP

     使用了BindingResult参数后,需要在每个校验方法中手动处理,较为麻烦,故考虑可以使用AOP统一处理。

    当我们编写环绕通知的时候,目标方法出现的异常一定要抛出去。

    @Aspect
    @Component
    //使用环绕通知
    public class DataValidAspect {
    
        @Around("execution(* com.wj.gmall.admin..*Controller.*(..))")
        public Object valid(ProceedingJoinPoint point){
            Object proceed = null;
            try {
                Object[] args = point.getArgs();
                for (Object arg : args) {
                    if(arg instanceof BindingResult){
                        BindingResult result = (BindingResult)arg;
                        if(result.getErrorCount()>0){
                            //框架自动校验检测未通过
                            return new CommonResult().validateFailed(result);
                        }
                    }
                }
                //调用目标方法
                proceed = point.proceed(args);
            } catch (Throwable throwable) {
                throwable.printStackTrace();
                throw new RuntimeException(throwable);
            }
            return proceed;
        }
    }
  • 相关阅读:
    maven3实战之仓库(快照版本)
    三、常见分析函数详解
    二、理解over()函数
    一、Oracle分析函数入门
    Java程序性能优化技巧
    同步synchronized用法
    java枚举使用详解
    jpa+spring配置多数据源
    jxl导入/导出excel
    CVS数据的导入和导出
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/13199714.html
Copyright © 2011-2022 走看看