@Validated和@Valid有什么不同呢?

戚薇 Java经验 发布时间:2022-07-13 15:43:14 阅读数:18060 1
下文笔者讲述@Validated和@Valid的区别说明,如下所示
Spring Validation验证框架对参数的验证机制提供了@Validated(Spring’s JSR-303规范,是标准JSR-303的一个变种)
javax提供了@Valid(标准JSR-303规范),配合BindingResult可以直接提供参数验证结果

JSR303定义的校验类型

空检查
@Null 验证对象是否为null
@NotNull 验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格
@NotEmpty 检查约束元素是否为NULL或者是EMPTY
Booelan检查
@AssertTrue 验证 Boolean 对象是否为 true
@AssertFalse 验证 Boolean 对象是否为 false
长度检查
@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=) 验证注解的元素值长度在min和max区间内
日期检查
@Past 验证 Date 和 Calendar 对象是否在当前时间之前
@Future 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern 验证 String 对象是否符合正则表达式的规则
数值检查,建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null
@Min 验证 Number 和 String 对象是否大等于指定的值
@Max 验证 Number 和 String 对象是否小等于指定的值
@DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
@DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
@Digits 验证 Number 和 String 的构成是否合法
@Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度
@Range(min=, max=) 验证注解的元素值在最小值和最大值之间
@Range(min=10000,max=50000,message="range.bean.wage") private BigDecimal wage;
@Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)
@CreditCardNumber 信用卡验证
@Email 验证是否是邮件地址,如果为null,不进行验证,算通过验证
@ScriptAssert(lang= ,script=, alias=)
@URL(protocol=,host=, port=,regexp=, flags=)

@Validated和@Valid区别

在检验入参是否符合规范时
 使用@Validated或者@Valid在基本验证功能上没有太多区别
 但在分组、注解地方、嵌套验证等功能上两个有所不同
1.分组
@Validated:
 提供了一个分组功能
 可以在入参验证时
根据不同的分组采用不同的验证机制
没有添加分组属性时
默认验证没有分组的验证属性

代码如下
public interface First{
}

public interface Second{
}
 
public class UserModel {
	@NotNull(message = "{id.empty}", groups = { First.class })
	private int id;
 
	@NotNull(message = "{username.empty}", groups = { First.class, Second.class })
	private String username;
 
	@NotNull(message = "{content.empty}", groups = { First.class, Second.class })
	private String content;
}
 
public String save(@Validated( { Second.class }) UserModel userModel, BindingResult result) {
	if (result.hasErrors()) {
		return "validate/error";
	}
	return "redirect:/success";
}
 
对一个参数需要多种验证方式时,也可通过分配不同的组达到目的
 例:
@NotEmpty(groups = { First.class })  
@Size(min = 3, max = 8, groups = { Second.class })  
private String name; 
 
@Valid:
  作为标准JSR-303规范
  还没有吸收分组的功能

2.注解地方

@Validated
  可用在类型、方法和方法参数上
  但是不能用在成员属性(字段)上
@Valid
  可用在方法、构造函数、方法参数和成员属性(字段)上

两者是否能用于成员属性(字段)上直接影响能否提供嵌套验证的功能。

3.嵌套验证

 public class TestItem {

    @NotNull(message = "id不能为空")
    @Min(value = 1, message = "id必须为正整数")
    private Long id;

    @Valid // 嵌套验证必须用@Valid
    @NotNull(message = "other不能为空")
    @Size(min = 1, message = "至少要有一个属性")
    private list<Other> other;
}

public class Other {

    @NotNull(message = "pid不能为空")
    @Min(value = 1, message = "pid必须为正整数")
    private Long pid;

    @NotNull(message = "vid不能为空")
    @Min(value = 1, message = "vid必须为正整数")
    private Long vid;

    @NotBlank(message = "pidName不能为空")
    private String pidName;

    @NotBlank(message = "vidName不能为空")
    private String vidName;
}


@RestController
public class ItemController {

    @RequestMapping("/item/add")
    public void addItem(@Validated TestItem testItem, BindingResult bindingResult) {
        /*业务代码*/
    }
} 

从以上的分析,我们可以得出@Validated和@Valid在嵌套验证功能上的区别:

@Validated
  在方法入参上无法单独提供嵌套验证功能
  不能用在成员属性(字段)上
  也无法提示框架进行嵌套验证
  能配合嵌套验证注解@Valid进行嵌套验证

@Valid
  用在方法入参上无法单独提供嵌套验证功能
  能够用在成员属性(字段)上
  提示验证框架进行嵌套验证
  能配合嵌套验证注解@Valid进行嵌套验证
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202207/16576982563968.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者