@Valid:

@Valid注解用于校验,所属包为:javax.validation.Valid。

① 首先需要在实体类的相应字段上添加用于充当校验条件的注解,如:@Min,如下代码(age属于Girl类中的属性):

@Min(value = 18,message = "未成年禁止入内")
private Integer age;

② 其次在controller层的方法的要校验的参数上添加@Valid注解,并且需要传入BindingResult对象,用于获取校验失败情况下的反馈信息,如下代码:

@PostMapping("/girls")
public Girl addGirl(@Valid Girl girl, BindingResult bindingResult) {
if(bindingResult.hasErrors()){
System.out.println(bindingResult.getFieldError().getDefaultMessage());
return null;
}
return girlResposity.save(girl);
}

bindingResult.getFieldError.getDefaultMessage()用于获取相应字段上添加的message中的内容,如:@Min注解中message属性的内容

@Validated:

@Valid是javax.validation里的。

@Validated是@Valid 的一次封装,是Spring提供的校验机制使用。@Valid不提供分组功能

@Validated的特殊用法

1、分组

当一个实体类需要多种验证方式时,例:对于一个实体类的id来说,新增的时候是不需要的,对于更新时是必须的。

可以通过groups对验证进行分组

分组接口类(通过向groups分配不同类的class对象,达到分组目的):

package com.valid.interfaces;  

public interface First {  

}  

实体类:

package com.valid.pojo;  

import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.NotEmpty; import com.valid.interfaces.First; public class People { //在First分组时,判断不能为空
@NotEmpty(groups={First.class})
private String id; //name字段不为空,且长度在3-8之间
@NotEmpty
@Size(min=3,max=8)
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
}
}

注:

(1)不分配groups,默认每次都要进行验证

(2)对一个参数需要多种验证方式时,也可通过分配不同的组达到目的。例:

控制类:

package com.valid.controller;  

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import com.valid.interfaces.First;
import com.valid.pojo.People; @Controller
public class FirstController { @RequestMapping("/addPeople")
//不需验证ID
public @ResponseBody String addPeople(@Validated People p,BindingResult result)
{
System.out.println("people's ID:" + p.getId());
if(result.hasErrors())
{
return "0";
}
return "1";
} @RequestMapping("/updatePeople")
//需要验证ID
public @ResponseBody String updatePeople(@Validated({First.class}) People p,BindingResult result)
{
System.out.println("people's ID:" + p.getId());
if(result.hasErrors())
{
return "0";
}
return "1";
}
}

注:
@Validated没有添加groups属性时,默认验证没有分组的验证属性,如该例子:People的name属性。

@Validated没有添加groups属性时,所有参数的验证类型都有分组(即本例中People的name的@NotEmpty、@Size都添加groups属性),则不验证任何参数

2、组序列

默认情况下,不同组别的约束验证是无序的,然而在某些情况下,约束验证的顺序却很重要。

例:

(1)第二个组中的约束验证依赖于一个稳定状态来运行,而这个稳定状态是由第一个组来进行验证的。

(2)某个组的验证比较耗时,CPU 和内存的使用率相对比较大,最优的选择是将其放在最后进行验证。因此,在进行组验证的时候尚需提供一种有序的验证方式,这就提出了组序列的概念。
一个组可以定义为其他组的序列,使用它进行验证的时候必须符合该序列规定的顺序。在使用组序列验证的时候,如果序列前边的组验证失败,则后面的组将不再给予验证。

分组接口类 (通过@GroupSequence注解对组进行排序):

package com.valid.interfaces;  

public interface First {  

}  
package com.valid.interfaces;  

public interface Second {  

}  
package com.valid.interfaces;  

import javax.validation.GroupSequence;  

@GroupSequence({First.class,Second.class})
public interface Group { }
package com.valid.pojo;  

import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.NotEmpty; import com.valid.interfaces.First;
import com.valid.interfaces.Second; public class People { //在First分组时,判断不能为空
@NotEmpty(groups={First.class})
private String id; //name字段不为空,且长度在3-8之间
@NotEmpty(groups={First.class})
@Size(min=3,max=8,groups={Second.class})
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
}
}
package com.valid.controller;  

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import com.valid.interfaces.Group;
import com.valid.pojo.People;
import com.valid.pojo.Person; @Controller
public class FirstController { @RequestMapping("/addPeople")
//不需验证ID
public @ResponseBody String addPeople(@Validated({Group.class}) People p,BindingResult result)
{
if(result.hasErrors())
{
return "0";
}
return "1";
}
}

3、验证多个对象

一个功能方法上处理多个模型对象时,需添加多个验证结果对象

package com.valid.controller;  

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import com.valid.pojo.People;
import com.valid.pojo.Person; @Controller
public class FirstController { @RequestMapping("/addPeople")
public @ResponseBody String addPeople(@Validated People p,BindingResult result,@Validated Person p2,BindingResult result2)
{
if(result.hasErrors())
{
return "0";
}
if(result2.hasErrors())
{
return "-1";
}
return "1";
}
}

spring注解第07课 @Valid和@Validated的总结区分的更多相关文章

  1. spring注解第02课 包扫描@ComponentScan、@ComponentScans

    1.配置文件形式: <context:component-scan base-package="com.atguigu" /> spring会扫描此包下的@Servic ...

  2. spring注解第01课 @Configuration、@Bean

    一.原始的 xml配置方式 1.Spring pom 依赖 <dependency> <groupId>org.springframework</groupId> ...

  3. spring注解第05课 FactoryBean

    1.工厂bean调用 @Configuration public class MainConfig2 {/** * 使用Spring提供的 FactoryBean(工厂Bean); * 1).默认获取 ...

  4. spring注解第04课 @Import

    1.beans package com.atguigu.bean; public class Blue { public Blue(){ System.out.println("blue.. ...

  5. spring注解第03课 按条件加载Bean @Conditional

    package com.atguigu.config; import org.springframework.context.annotation.Bean; import org.springfra ...

  6. spring注解第06课 @Value

    1.注入<bean>中的属性 支持3种类型的赋值 <bean id="person" class="com.model.Person"> ...

  7. Spring中的@Valid 和 @Validated注解你用对了吗

    1.概述 本文我们将重点介绍Spring中 @Valid和@Validated注解的区别 . 验证用户输入是否正确是我们应用程序中的常见功能.Spring提供了@Valid和@Validated两个注 ...

  8. spring注解式参数校验

    很痛苦遇到大量的参数进行校验,在业务中还要抛出异常或者返回异常时的校验信息,在代码中相当冗长,今天我们就来学习spring注解式参数校验. 其实就是:hibernate的validator. 开始啦. ...

  9. Spring注解之Controller中获取请求参数及验证使用

    1.处理request的uri部分的参数:@PathVariable. 2.处理request header部分的参数:@RequestHeader,@CookieValue@RequestHeade ...

随机推荐

  1. Oracle中rownum和rowid的理解

    rownum,rowid都叫伪列. 但是,rownum是逻辑上的编号,且其值总是从1开始,每行的rounum不是固定的.而rowid是“物理”编号.若数据库文件没有移动,则每行的 rowid一般是固定 ...

  2. Delphi之Exception获得错误信息(简单好理解)

    Delphi之Exception获得错误信息 相关资料: http://www.cnblogs.com/hackpig/archive/2010/02/15/1668547.html 实例代码: 1 ...

  3. js Location

    window.location用來返回頁面的地址,并把頁面重定向新的頁面: location.pathname:返回當前的頁面地址和文件名 location.hostname:主機名 location ...

  4. python之datetime类

    datetime.time时间类,一般用于显示当地时间 import datetime # 新建对象 datetime_obj = datetime.time(hour=12, minute=20, ...

  5. BZOJ2793[Poi2012]Vouchers——枚举

    题目描述 考虑正整数集合,现在有n组人依次来取数,假设第i组来了x人,他们每个取的数一定是x的倍数,并且是还剩下的最小的x个.正整数中有m个数被标成了幸运数,问有哪些人取到了幸运数. 输入 第一行一个 ...

  6. Educational Codeforces Round 26 B,C

    B. Flag of Berland 链接:http://codeforces.com/contest/837/problem/B 思路:题目要求判断三个字母是否是条纹型的,而且宽和高相同,那么先求出 ...

  7. MT【25】切线不等式原理及例题

    评:切线不等式和琴生(Jesen)不等式都是有其几何意义的,在对称式中每一项单变量后利用图像的凹凸性得到一个线性的关系式.已知的条件往往就是线性条件,从而可以得到最值.

  8. TensorFlow分布式计算机制解读:以数据并行为重

    Tensorflow 是一个为数值计算(最常见的是训练神经网络)设计的流行开源库.在这个框架中,计算流程通过数据流程图(data flow graph)设计,这为更改操作结构与安置提供了很大灵活性.T ...

  9. 自学Linux Shell11.6-退出shell

    点击返回 自学Linux命令行与Shell脚本之路 11.6-退出shell shell运行的每一个命令都是使用 退出状态码 告诉shell它已经运行完毕.退出状态码是一个0~255的整数值,在命令结 ...

  10. 自学Aruba5.2-Aruba安全认证-有PEFNG 许可证环境的角色策略管理

    点击返回:自学Aruba之路 自学Aruba5.2-Aruba安全认证- 有PEFNG 许可证环境的角色策略管理 导入许可后,可以对Role进行配置: 1. 系统自带的Role的可以修改的属性: 2. ...