Springboot使用@Valid和@Validated进行校验

@Validated

所属包为org.springframework.validation.annotation,属于spring的校验机制,具有分组校验功能

@Valid

所属包为javax.validation,jdk自带,不具备分组校验功能

用法(以下类省略gettet,setter)

@PostMapping("/register")
 public Object handleRegister(@RequestBody @Validated() User user){
        //Your logic
}

@validated修饰需要校验的实体类
对应实体类的变量需用javax.validation.constraint下的注解进行修饰

在这里插入图片描述

public class User implements Serializable {

	@Notnull
	String name;
	
	@Min(0)
	@Max(200)
    private Integer age;

    @Pattern(regexp = "^[男女]$", message = "性别应为男或女")
    private String gender;

    @Pattern(regexp = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$", message = "手机号格式错误")
    private String tel;
}

通过这样的形式,如果解析出来的User实例不满足如上所限定,那么将会返回一个400Badrequest。
另外如果检验对象是基本类型,类似

 @PostMapping("/register")
    public Object handleRegister( @RequestBody @Size(max = 10) String user)

则需要在方法所在的Controller上修饰@Validated

@Validated
public class RegisterController

但是对于基本类型,检验不满足则会在线程中抛出异常,并返回500内部错误回应,所以感觉不太好用(不知道是不是有别的方法)
@Valid常常用于嵌套校验,说白了就是假如我的User有个Dog,也需要进行校验,那么就这样干

public class User implements Serializable {

    @Valid
    Dog dog;

	@Notnull
	String name;
	
	@Min(0)
	@Max(200)
    private Integer age;


    @Pattern(regexp = "^[男女]$", message = "性别应为男或女")
    private String gender;

    @Pattern(regexp = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$", message = "手机号格式错误")
    private String tel;
}
public class Dog{
	@Size(1,3)
	private String name;
}

这样在校验的时候就会顺带连dog一起校验了,这个dog的名字长度在1-3个字符之间。

分组校验

有时候对User的操作有插入和更新,在不同情境下需要用到的校验条件不一样,我想要插入时name不为空,更新时name可选但是tel不为空,那么这时就需要用到分组校验了。

public class User implements Serializable {
    interface groupInsert extends Default{}
    interface groupUpdate extends Default{}

    @Valid
    Dog dog;

	@NotNull(groups = groupInsert.class)
	String name;
	
	@Min(0)
	@Max(200)
    private Integer age;


    @Pattern(regexp = "^[男女]$", message = "性别应为男或女")
    private String gender;
	@NotNull(groups = groupUpdate.class)
    @Pattern(regexp = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$", message = "手机号格式错误")
    private String tel;
}
//控制器
@PostMapping("/register")
 public Object handleInsert(@RequestBody @Validated({groupInsert.class}) User user){
        //Your logic
}

@PostMapping("/register")
 public Object handleUpdate(@RequestBody @Validated({groupUpdate.class}) User user){
        //Your logic
}

由此就可以实现分组校验
需要注意的是groupInsert和groupUpdate都继承了Default,其作用是当@Validated没有指定分组时,会由于这两个分组也属于Default.class将他们一起进行校验;不继承的效果就是默认情况下不进行校验。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值