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

作者:J-Jian 时间:2023-09-20 19:49:55 

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";
 }

来源:https://blog.csdn.net/Mynewclass/article/details/79086372

标签:SpringMVC,@Validated注解,验证
0
投稿

猜你喜欢

  • java信号量控制线程打印顺序的示例分享

    2023-05-09 12:27:38
  • Json字符串转Java对象和List代码实例

    2022-03-11 15:47:09
  • Java中Runnable与Callable接口的区别详解

    2021-12-22 11:33:28
  • 在IntelliJ IDEA中为自己设计的类库生成JavaDoc的方法示例

    2023-11-25 09:49:02
  • C#实现时间戳与标准时间的互转

    2023-07-16 08:09:38
  • 解决Android Studio4.1没有Gsonfomat插件,Plugin “GsonFormat” is incompatible的问题

    2021-08-27 22:10:37
  • Android游戏开发之黑白棋

    2023-05-24 13:39:03
  • MyBatis如何调用存储过程与存储函数

    2023-06-14 16:10:51
  • SpringBoot使用WebSocket的方法实例详解

    2022-12-26 03:19:25
  • Android Volley图片加载功能详解

    2023-11-19 08:01:41
  • Android判断Activity是否在最上层的方法

    2023-05-09 05:31:01
  • Android Button按钮的四种点击事件

    2021-12-16 04:02:41
  • Java基础学习之方法的重载知识总结

    2023-10-27 01:45:15
  • SpringBoot 读取yml文件的多种方式汇总

    2023-08-03 13:10:43
  • Springcloud seata nacos环境搭建过程图解

    2022-11-15 00:34:14
  • c# BackgroundWorker组件的作用

    2022-12-23 20:56:12
  • Java SSM实现前后端协议联调详解上篇

    2023-09-16 20:42:22
  • Java初学之继承与多态

    2022-11-29 15:13:04
  • Java日常练习题,每天进步一点点(10)

    2022-08-11 21:55:53
  • Java里的static在Kotlin里如何实现

    2023-08-24 20:25:33
  • asp之家 软件编程 m.aspxhome.com