Validation失效

validation对pojo和传入的参数进行校验

导包
 <!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
    <dependency>
      <groupId>javax.validation</groupId>
      <artifactId>validation-api</artifactId>
      <version>1.1.0.Final</version>
    </dependency>
加注解

注解名称

描述

AssertFalse

被注解的元素属性值必须为false

AssertTrue

被注解的元素属性值必须为true

DecimalMax

验证注解的元素值小于等于指定的value值

DecimalMin

验证注解的元素值大于等于指定的value值

Digits

验证注解的元素值的整数位数和小数位数上限

Max

被注解的元素值的类型必须为数字,其值必须小于等于指定的最大值

Min

被注解的元素值的类型必须为数字,其值必须大于等于指定的最小值

Email

Future

被注解的元素值得范围必须为未来的一个时间

FutureOrPresent

被注解的元素值得范围必须为未来的一个时间或者现在得时间

Past

被注解的元素的值范围必须为过去的一个时间

PastOrPresent

被注解的元素的值范围必须为过去或者现在的一个时间

Negative

适用于数值并验证它们是严格负数,不包括0

NegativeOrZero

适用于数值并验证它们是严格负数,包括0

Positive

适用于数值并验证它们是严格正数,不包括0

PositiveOrZero

适用于数值并验证它们是严格正数,包括0

NotBlank

验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的首位空格

NotEmpty

验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0

NotNull

被注解的元素属性值必须非null

Null

被注解的元素属性值必须为null

Pattern

被注解的元素值必须符合指定的正则表达式

Size

被注解的元素属性值的大小必须在指定范围内

group的使用

这个属性的作用就是举个例子:例如我们在传参的时候,加入我们创建一个用户,那么我们再传入的参数是不会包含用户的id,而如果更新这个用户,我们就需要传入用户id,那么根据多种校验规则的时候,这个属性就起作用了。

如果我们在一个属性使用注解的时候,如果不指定groups的时候,其实默认是在Default 组别中

@NotNull(message = "姓名不能为空")
private String name;

等同于
import javax.validation.groups.Default;
@NotNull(message = "姓名不能为空" , groups = {Default.class})
private String name;  

那么根据这个情况,如果我们想自定义组别的时候,我们就可以分为以下几个步骤:

  • 定义组别

  • 使用组别

  • controller调用

(1)定义组别

import javax.validation.groups.Default;

public interface CreateUser {
}

import javax.validation.groups.Default;

public interface UpdateUser{
}

(2)使用组别

@Data
class User{
    	
    	@NotNull(message = "用户id不能为空", groups = UpdateUser.class)
    	private Integer id;
   
        @NotNull(message = "姓名不能为空" ,groups = {CreateUser.class, UpdateUser.class})
        private String name;
    
        @NotNull(message = "性别不能为空")
        private String sex;
    
        @Max(value = 20 ,message = "最大长度为20")
        private String address;
    
        @Email(message = "不满足邮箱格式")
        private String email;
    
        @AssertTrue(message = "字段为true才能通过")
        private boolean isAuth;
    
        @NotBlank(message = "手机号不能为空")
        @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手机号格式有误")
        private String mobile;
    
        @Future(message = "时间在当前时间之后才可以通过")
        private Date date;
}

(3)调用组别

 /**
     * 走参数校验注解的 groups 组合校验
     *
     * @param user
     * @return
     */
@PostMapping("/users/update")
public ResponseDTO updateUser(@RequestBody @Validated(UpdateUser.class) User user) {
     userService.updateById(userDTO);
     return ResponseDTO.success();
}


 /**
     * 走参数校验注解的 groups 组合校验
     *
     * @param user
     * @return
     */
@PostMapping("/users/save")
public ResponseDTO saveUser(@RequestBody @Validated(CreateUser.class) User user) {
     userService.saveUser(userDTO);
     return ResponseDTO.success();
}

validation失效情况:

@GroupSequence标记的分组

这个情况是复合注解,即这个注解中包括两个注解,还是按顺序验证的,可以在controller上使用

@Validation(Gruop.class),但是为什么会失效呢,原因是不能再POJO上用groups={Gruop.class}

正确的是写这个复合注解包含的注解

@Validation(AddGroup.class)和@Validation(UpdateGroup.class)都写上。

在controller中会按顺序验证(不然随机验证)

完整代码:

@NotBlank(message = "发送短息的模板不能为空",groups = {AddGroup.class})
@NotNull(message = "发送短息的模板不能为null",groups = {UpdateGroup.class})
@TableField(exist = false)
private String templateName;
@GroupSequence({AddGroup.class, UpdateGroup.class})
public interface Group {
}
public Object querySms(@RequestBody @Validated(Group.class) IdmSmsManagerVO queryVO) {
    ....
}
当controller中使用分组,默认没有分组的校验如何生效

解决:让分组interface继承Default ,这时controller会同时校验指定分组和未被分组的校验

public interface AddGroup extends Default {

}
public Object querySms(@RequestBody @Validated(AddGroup.class) IdmSmsManagerVO queryVO) {
    ....
}

pojo中没有指定分组,但是仍然可以参与校验

@NotBlank(message = "发送短息的模板不能为空")
@TableField(exist = false)
private String templateName;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值