@Validated  :绑定需要校验的数据.

数据校验规则:为数据绑定校验的规则

private Long booId;
@NotNull(message = "不能为空")
private String bookName;
private String author;
private String publisher;
@DecimalMin(value = "20",message = "不能低于20元")
@DecimalMax(value = "100",message = "不能多于100")
private Float price;
//正则表达式检验
//正则表达式用来判断某个字符串是否符合某个规则
//或者用来提取一整个字符 串中满足某个规则的子串
@Pattern(regexp = "1[345678][0-9]{9}")
private String Mobile; 为是实体类属性绑定检验规则:
message为检验不合格时的提示信息.
import javax.validation.constraints.*;

public class BookBean  {
private Long booId;
@NotNull(message = "书名不能为空")
private String bookName;
private String author;
private String publisher;
@DecimalMin(value = "20",message = "不能低于20元")
@NotNull(message = "价格不能为空")
@DecimalMax(value = "100",message = "不能多于100")
private Float price; //正则表达式检验
//正则表达式用来判断某个字符串是否符合某个规则
//或者用来提取一整个字符 串中满足某个规则的子串
@Pattern(regexp = "1[345678][0-9]{9}")
private String Mobile;public String getIdCard() {
return idCard;
} public void setIdCard(String idCard) {
this.idCard = idCard;
} public String getMobile() {
return Mobile;
} public void setMobile(String mobile) {
Mobile = mobile;
} public Long getBooId() {
return booId;
} public void setBooId(Long booId) {
this.booId = booId;
} public String getBookName() {
return bookName;
} public void setBookName(String bookName) {
this.bookName = bookName;
} public String getAuthor() {
return author;
} public void setAuthor(String author) {
this.author = author;
} public String getPublisher() {
return publisher;
} public void setPublisher(String publisher) {
this.publisher = publisher;
} public Float getPrice() {
return price;
} public void setPrice(Float price) {
this.price = price;
}
}

绑定数据检验:

注意:校验结果:BindingResult  result必须经跟在@Validated BokBean bokBean 后面.用于接受检验的结果.

    @RequestMapping("/book/creat")
public String create(@Validated BokBean bokBean, BindingResult result, Model model){ //可以通过BindingResult对象拿到校验的错误信息.
//注意:该参数必须要紧跟在被校验的对象的后面
if (result.hasErrors()){
//判断是否有检验的错误
// result.getFieldError("bookName").getDefaultMessage();
for (FieldError error : result.getFieldErrors()) {
//获取被校验对象的所有错误
String message = error.getDefaultMessage();
System.out.println(message);
}
//可以直接把错误信息的集合都放到集合里
model.addAttribute("erros", result.getFieldErrors());
return "erro";
}
return "success";
}

自定义检验规则,有时候spring自带的检验规则不满足我们使用时,可以自定义检验规则.

检验规则:

public class IDValidator implements ConstraintValidator<IDVlidation,String> {
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
//这里引用了一个身份证检验的工具类
return IdCardUtils.isIDCard(value);
}

//这个方法可不实现
@Override
public void initialize(IDVlidation constraintAnnotation) { }
}

自定义一个检验规则的注解,自定义注解见自定义注解章节:https://www.cnblogs.com/zhouchangyang/p/10908343.html

定义这个注解为了方便,可仿造spring定义的注解规则写(赋值粘贴)

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })  //表明该注解可用在哪里
@Retention(RUNTIME) //表明生效时间
@Repeatable(IDVlidation.List.class)
@Constraint(validatedBy = {IDValidator.class}) //注明该注解所实现的规则是哪个类
public @interface IDVlidation { String message() default ""; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@interface List { IDVlidation[] value();
} }

这样就定义好了一个规则的注解,

使用自定义注解和使用系统的注解一样,添加到需要校验的属性上面即可:

    @IDVlidation(message = "省份证不符合规范")
private String idCard;

获取校验的后不满足规则的错误信息方式有两种:

一种就像上面一样在 方法参数中检验的对象后面添加 BindingResult result,

 @RequestMapping("/book/creat")
public String create(@Validated BokBean bokBean, BindingResult result, Model model){

第二种是单独写一个获取错误信息的方法,在方法上添加注解,@ExceptionHandler(BindException.class),

通过 BindException ex  一样能获得第一种方法的BindingResult 对象.对错误信息的进一步操作和第一种方法一样.

    @ExceptionHandler(BindException.class)
public String resolveBindinngExcrption(BindException ex){
//获取错误结果集.
BindingResult result = ex.getBindingResult();
FieldError error = ex.getFieldError();
System.out.println(result);
return "erro";
}

分组校验:

某些时候,我们前端的某些请求需要对某个对象的一部分属性进行校验,有一部分属性不需要校验.

这时我们就需要对校验的属性进行分组,根据前端的需求对属性进行分类.

比如登录和注册业务,他们引用的都是用户对象,但是登录只需要校验用户名和密码,而注册除了校验登录和注册还需要校验很多数据,

假如规定了注册时手机号不能为空,在登陆时不需要手机号,就会报错,这时就需要用分组来针对性的校验.

创建一个实体类,并对属性添加校验规则和分组信息,

public class UserBean  {

    //登录分组
public interface LoginGroup{}
//注册分组
public interface RegisterGroup{} @NotBlank(message = "不能为空",groups = {LoginGroup.class,RegisterGroup.class})
private String username;
@JsonIgnore //表示不想序列化的数据
@NotBlank(groups = {LoginGroup.class,RegisterGroup.class})
private String password;
@Pattern(message = "手机号错误",regexp = "1[3-9][\\d]{9}",groups = {RegisterGroup.class})
@NotNull(message = "手机号不能为空",groups = {RegisterGroup.class})
private String mobile;
@AssertTrue(groups = {RegisterGroup.class})
private boolean agree;
@JsonFormat(pattern = "yyyy-MM-dd-HH:mm:ss",timezone = "GMT+8")
private Date birthday; public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getMobile() {
return mobile;
} public void setMobile(String mobile) {
this.mobile = mobile;
} public boolean isAgree() {
return agree;
} public void setAgree(boolean agree) {
this.agree = agree;
}
}

分组校验用法:

在实体类中创建内部接口类(可以是普通类),用来对业务进行分类,

public class UserBean  {

    //登录分组
public interface LoginGroup{}
//注册分组
public interface RegisterGroup{}

在属性的检验规则中添加分组属性 :

@NotBlank(message = "不能为空",groups = {LoginGroup.class,RegisterGroup.class})
表示这个不能为空的检验规则登录和注册都需要满足.
   //登录分组
public interface LoginGroup{}
//注册分组
public interface RegisterGroup{} @NotBlank(message = "不能为空",groups = {LoginGroup.class,RegisterGroup.class})
private String username;
@JsonIgnore //表示不想序列化的数据
@NotBlank(groups = {LoginGroup.class,RegisterGroup.class})
private String password;
@Pattern(message = "手机号错误",regexp = "1[3-9][\\d]{9}",groups = {RegisterGroup.class})
@NotNull(message = "手机号不能为空",groups = {RegisterGroup.class})
private String mobile;
@AssertTrue(message = "必须为真",groups = {RegisterGroup.class})
private boolean agree;

规定好校验规则和分组后,只需在需要校验的地方使用就可以,

用法:在方法参数检验标记中添加分组属性:@Validated(UserBean.LoginGroup.class)

表示只有被UserBean.LoginGroup.class分组的校验规则才会被列入本次校验

@Controller
public class UserController { @RequestMapping("/login")
public String login(@Validated(UserBean.LoginGroup.class) UserBean userBean){
return "success";
} @RequestMapping("/register")
public String register(@Validated(UserBean.RegisterGroup.class) UserBean userBean){
return "success";
}
												

Spring_数据校验和自定义检验规则和分组校验的更多相关文章

  1. SpringBoot Validation参数校验 详解自定义注解规则和分组校验

    前言 Hibernate Validator 是 Bean Validation 的参考实现 .Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的 ...

  2. 9) drf JWT 认证 签发与校验token 多方式登陆 自定义认证规则反爬 admin密文显示

    一 .认证方法比较 1.认证规则图 django 前后端不分离 csrf认证 drf 前后端分离 禁用csrf 2. 认证规则演变图 数据库session认证:低效 缓存认证:高效 jwt认证:高效 ...

  3. springMVC:校验框架:多规则校验,嵌套校验,分组校验;ssm整合技术

    知识点梳理 课堂讲义 学习目标 能够阐述表单验证的分类和区别 能够运用表单验证的常用注解 能够编写表单验证的示例 能够编写SSM整合的应用案例 能够总结SSM整合的步骤 1 校验框架 1.1 入门-视 ...

  4. 自定义 Lint 规则简介

    上个月,笔者在巴黎 Droidcon 的 BarCamp 研讨会上聆听了 Matthew Compton 关于编写自己的 Lint 规则的讲话.深受启发之后,笔者想就此话题做进一步的探索. 定义 如果 ...

  5. 在ubuntu16.04中安装apache2+modsecurity以及自定义WAF规则详解

    一.Modsecurity规则语法示例 SecRule是ModSecurity主要的指令,用于创建安全规则.其基本语法如下: SecRule VARIABLES OPERATOR [ACTIONS] ...

  6. salesforce 零基础学习(六十三)Comparable实现Object列表数据的自定义排序

    项目中通常有些需求为需要将某个sObject的数据列表按照某种规则排序显示到前台页面上,但是list上面的sort远远满足不了复杂的功能,此种情况需要自定义比较两个object大小的方法,所以需要创建 ...

  7. thinkPHP5.0验证器自定义验证规则

    自定义验证规则 protected $rule = [ 'views' => 'require|number|checkviews:0',//checkviews为自定义验证规则,0是传过去的规 ...

  8. Spring MVC 基于AnnotationFormatterFactory接口实现自定义的规则

    1.创建一个类来实现AnnotationFormatterFactory接口 代码: package com.oukele.CustomAnnotation; import com.oukele.mo ...

  9. Django【第16篇】:Django之Form组件自定义验证规则

    自定义验证规则以及中间件简单介绍 1.python2和python3中的区别 对于python2内置的字符串类型有str和unicode 比如:"abc"是字符串,u"你 ...

随机推荐

  1. 剑指offer——28对称的二叉树

    题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的.     题解: 使用正常前序遍历与反向的前序遍历进行比较结果即可,注意,需将空 ...

  2. Git 学习(一)安装 Git

    这里写自定义目录标题 这一章介绍怎么安装 Git 大家都是开发老司机,就不简介什么是 Git 了,直接开花. 在 Linux 上安装Git 在 Windows 上安装 Git 初次使用 Git 前的配 ...

  3. 常用sign算法

    所有参数包括appkey或者token拼接成&key=value格式 转小写 正序排序 MD5后得到sign

  4. 大道浮屠诀---cwRsync同步工具的使用

    目的: 在日常生活中,我们有时候会遇到这样类似的问题 ---需要把一台服务器上的某个重要的文件进行备份(拷贝另外的服务器上) ---需要同步系统上的配置文件到其他系统 利用此cwRsync软件可以解决 ...

  5. shell对比两个目录中有哪些文件不同

    参考:https://www.cnblogs.com/liyuchuan/p/10756066.html 目录结构: /data/dir1 subdir/ subfile /data/dir2 sub ...

  6. WinCE下的第二个窗口程序

    MFC写的,有些简陋,但是还是感觉不错,一个小小的计算器,各个方面的功能都完成了 但是唯独那个CEdit里面的文字不能右对齐.那个扩展风格用不了

  7. 集群cluster概念

    集群是由两台或多台计算机(称为节点node或成员member)共同执行任务群集 集群方式: 存储集群  GFS共享存储 负载均衡  LB load balance 高可用     HA high av ...

  8. MySQL数据库的基本语法

    1.MySQL数据类型数值以及浮点型介绍 2.MySQL数据类型之字符串介绍 常用的有:char.varchar.text. 3.MySQL数据类型之时间类型介绍 常用的是:timestampt,将时 ...

  9. Python 输入字符串找(String)下标 没有返回-1

    str = "abcdefg123456"a = input("请输入一个字母或数字:")num = 0result = -1while num < le ...

  10. String str = new String("abc"),这段代码一共生成了几个String对象?为什么?

    String str = new String("abc")创建了俩个对象,首先为创建一个String对象"abc",然后在调用String类的构造方法时 pu ...