使用SpringMVC的@Validated注解验证的实现

1、SpringMVC验证@Validated的使用

第一步:编写国际化消息资源文件

编写国际化消息资源ValidatedMessage.properties文件主要是用来显示错误的消息定制

edit.username.null=用户名不能为空
edit.password.size=密码最少{min}位,最长{max}位
......

可以将edit.username.null与edit.password.size看为参数,在message中传递,具体请看第二步。

第二步:Bean实体类中加注解

首先介绍关于验证注解的类型种类

@Null 限制只能为null
@NotNull 限制必须不为null
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value) 限制必须为一个不大于指定值的数字
@DecimalMin(value) 限制必须为一个不小于指定值的数字
@Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future 限制必须是一个将来的日期
@Max(value) 限制必须为一个不大于指定值的数字
@Min(value) 限制必须为一个不小于指定值的数字
@Past 验证注解的元素值(日期类型)比当前时间早
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在min到max之间
@NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

使用 这些注解很简单,只需要在实体类中的变量属性前面加上该注解即可。

public class User {
  private String id;
  @NotEmpty(message = "{edit.username.null}")
  private String username;
  @Size(min=6 ,max= 20 ,message = "{edit.password.size}")
  private String password;
  ......
}

其中{}相当于占位符,将min、max参数传图,同时也将消息文件中定制的错误信息传入,当然也可以直接不使用国际化文件,但是推荐使用,方便统一与修改。

public class User {
  private String id;
  @NotEmpty(message = "用户名不能为空")
  private String username;
  @Size(min=6 ,max= 20 ,message = "密码最少6位,最高20位")
  private String password;
  ......
}

第三步:Controller层的编写

Controller层的使用,很简单。需要在相应的方法传入的Bean参数前面增加注解@Validated,还有增加BindingResult参数即可,具体请看代码示例:

@Controller
public class UserController { 

  @RequestMapping("/save")
  public String save(@Validated User user, BindingResult result) {
    if(result.hasErrors()) {
      return "error";
    }
    return "success";
  }
}

第四步:在View层显示错误信息

这里就不做介绍了,实际项目中会封装好相应的javcscript等方法,只需要调用就可以返回页面提示给用户错误信息。

2、@Validated的分组特性

先在记录之前,介绍一下这样的场景:在对用户的帐号密码进行编辑保存以及新增是两种不一样的情况。

编辑修改->保存:只需要验证username与password是否符合条件即可,不需要验证id(因为在数据库中id已经存在)。

新增->保存:新增需要验证username与password是否符合条件,还要验证id。

这时候就用到groups分组分情况对Bean属性变量进行验证,也可以满足多验证。具体的需要一下两个步骤

第一步:创建分组接口类

分组接口类只是普通的接口类并没有多大意义,只是用来标识这个属性哪种情况下被验证,这类似于java.io.Serializable

public interface addUser{
}
public interface editUser{
}

第二步:Controller方法参数中增加xxx.class接口

在对新增的用户进行ID验证,增加@Validated({addUser.class})接口类用来表示新增的User.getId()需要验证。

@Controller
public class UserController { 

  @RequestMapping("/saveAdd")
  public String saveAddUser(@Validated({addUser.class}) User user, BindingResult result) {
    if(result.hasErrors()) {
      return "error";
    }
    return "success";
  }

第三步:Bean中添加groups分组

在User实体类中添加groups分组@NotEmpty(groups={addUser.class})与UserController中@Validated({addUser.class})对应,说明在执行saveAddUser新增用户的情况下,才对新增的用户id进行验证。

public class User {
  //在分组addUser时,验证id不能为空,其他情况下不做验证
  @NotEmpty(groups={addUser.class})
  private String id;
  @NotEmpty(message = "用户名不能为空")
  private String username;
  @Size(min=6 ,max= 20 ,message = "密码最少6位,最高20位")
  private String password;
  ......
}

以上三步就可以简单地完成分组验证,但是对分组验证补充一下三点:

第一是:不分配groups分组时,默认每次都需要验证。

第二是:通过groups分组可以对同一个变量进行多个验证,如下代码

//对用户名进行两次不同情况的验证。
@NotEmpty(groups={First.class})
@Size(min=1,max=10,groups={Second.class})
public String username;

第三是:默认的情况下,不同的分组约束验证是无序的,但是在有些情况下验证的相互约束很重要(比如前一个组验证失败,后面的将不再验证等情况),所以groups分组的验证也有前后验证顺序。使用@GroupSequence注解进行排序。

/*
 * 分组顺序接口类
 */
import javax.validation.GroupSequence;
//分组序列先Frist再Second
@GroupSequence({First.class,Second.class})
public interface Group{
}

@Controller
public class UserController { 

  @RequestMapping("/saveAdd")
  public String saveAddUser(@Validated({Group.class}) User user, BindingResult result) {
    if(result.hasErrors()) {
      return "error";
    }
    return "success";
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解Spring 参数验证@Validated和@Valid的区别

    Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303 规范,是标准 JSR-303 的一个变种),javax提供了@Valid(标准JSR-303规范),配合 BindingResult 可以直接提供参数验证结果.其中对于字段的特定验证注解比如 @NotNull 等网上到处都有,这里不详述 在检验 Controller 的入参是否符合规范时,使用 @Validated 或者 @Valid 在基本验证功能上没有太多区别.但是在分组.

  • 使用SpringMVC的@Validated注解验证的实现

    1.SpringMVC验证@Validated的使用 第一步:编写国际化消息资源文件 编写国际化消息资源ValidatedMessage.properties文件主要是用来显示错误的消息定制 edit.username.null=用户名不能为空 edit.password.size=密码最少{min}位,最长{max}位 ...... 可以将edit.username.null与edit.password.size看为参数,在message中传递,具体请看第二步. 第二步:Bean实体类中加注解

  • springmvc的@Validated注解使用

    1. 校验的错误信息, 可以直接在bean属性上配置, 也可以在properties中配置. 2. 将校验器bean配置到注解驱动上 3. 在需要校验的pojo前边添加@Validated,在需要校验的pojo后边添加BindingResult bindingResult接收校验出错信息 注意:@Validated和BindingResult bindingResult是配对出现,并且形参顺序是固定的(一前一后). 使用validated所需配置: 1. jar包 2. application.

  • Java使用@Validated注解进行参数验证的方法

    目前项目中大部分代码进行参数验证都是写代码进行验证,为了提升方便性和代码的简洁性,所以整理了下使用注解进行参数验证.使用效果如下: // 要验证的实体类 @Data public class User implements Serializable { @NotBlank(message = "id不能为空!",groups = Update.class) protected String id = ""; @NotBlank(message = "商户i

  • @validated注解异常返回JSON值方式

    目录 @validated注解异常返回JSON值 使用@Valid注解,对其参数错误异常的统一处理 @validated注解异常返回JSON值 @ControllerAdvice public class ValidParamExceptionHandler { @ExceptionHandler(value = Exception.class) @ResponseBody public Map<String, Object> allExceptionHandler(Exception e){

  • SpringMVC实现表单验证功能详解

    本章节内容很丰富,主要有基本的表单操作,数据的格式化,数据的校验,以及提示信息的国际化等实用技能. 首先看效果图 项目结构图 接下来用代码重点学习SpringMVC的表单操作,数据格式化,数据校验以及错误提示信息国际化.请读者将重点放在UserController.java,User.java,input.jsp三个文件中. maven 项目必不可少的pom.xml文件.里面有该功能需要的所有jar包. <?xml version="1.0" encoding="UTF

  • spring @Validated 注解开发中使用group分组校验的实现

    之前知道spring支持JSR校验,在自己定义的bean中加入@NotNull,@NotBlank,@Length等之类的校验用于处理前台传递过来的request请求,避免在写多余的代码去处理. 但是随着业务的复杂度增加,对于校验的制定也越来越有要求,这个时候就需要引入分组group的概念,在自定义注解@Validated中 定义了一个Class[]数组用来分组.这样我们就可以引入分组校验的概念,首先根据需要的分组新建自己的接口. 然后在需要校验的bean上加入分组: 最后根据需要,在Contr

  • SpringBoot @Validated注解实现参数分组校验的方法实例

    前言 在前后端分离开发的时候我们需要用到参数校验,前端需要进行参数校验,后端接口同样的也需要,以防传入不合法的数据. 1.首先还是先导包,导入pom文件. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> 2.解释一下注解的作用 @N

  • 解决SpringMVC使用@RequestBody注解报400错误的问题

    一般使用@RequestBody接收的时候报400都是传入的json字符串和对应封装的对象不对应造成的 首先要注意 封装的对象中的字段类型有没有Date类型或者int等类型的,如果有的话,在set方法中统一将传入的参数要调整为String类型 在set方法中进行参数的转换 比如有一个Date类型的字段 private Date startTime; public Date getStartTime() { return startTime; } public void setStartTime(

  • spring 注解验证@NotNull等使用方法

    本文介绍了spring 注解验证@NotNull等使用方法,分享给大家,具体如下: 常用标签 @Null  被注释的元素必须为null @NotNull  被注释的元素不能为null @AssertTrue  被注释的元素必须为true @AssertFalse  被注释的元素必须为false @Min(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值 @Max(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值 @DecimalMin(value)

  • java自定义注解验证手机格式的实现示例

    1.@Valid与@Validated的区别 1.1 基本区别 @Valid:Hibernate validation校验机制 @Validated:Spring Validator校验机制,这个也是最常用的 @Validation只是对@Valid进行了二次封装,在使用上并没有太大区别,但在分组.注解位置.嵌套验证等功能上有所不同 1.2 作用范围 @Validated:用在类型.方法和方法参数上.但不能用于成员属性(field) @Valid:可以用在方法.构造函数.方法参数和成员属性(fi

随机推荐