【JSR-303】常用注解及其使用场景、注意事项
一、JSR-303简介:
JSR-303是 JAVA EE 6 中的一项子规范,主要用于后端对前端传过来的参数做一些规则性校验,它以注解的方式来解决日常开发中的参数校验问题。
二、Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>springboot项目不需要填写,它会根据springboot版本自动适配</version>
</dependency>
三、使用场景
注解名称 | 注解作用说明 |
---|---|
@NotNull | 主要用于对象的校验,校验对象不能为null,无法检查长度为0的字符串 |
@NotBlank | 用于String类型参数校验,检查字符串不能为null且trim()之后的size>0 |
@NotEmpty | 主要用于集合校验,校验集合不能为null且不能size>0,也可以用于String的校验 |
@Size | 用于对象(Array,Collection,Map,String)长度是否在给定的范围之内 |
@Range | 控制一个数值的范围 |
@Length | 用于String对象的大小必须在指定的范围内 |
@Pattern | 用于String对象是否符合正则表达式的规则 |
用于String对象是否符合邮箱格式 | |
@Min | 用于Number和String对象是否大等于指定的值 |
@Max | 用于Number和String对象是否小等于指定的值 |
@AssertTrue | 用于Boolean对象是否为true |
@AssertFalse | 用于Boolean对象是否为false |
四、JSR-303扩展之LIstValue
1、编写自定义的校验器,开始编写这个注解对应的校验器,也就是真正的让注解产生作用的类,这个类首先实现校验器,泛型就是这个注解和注解中定义的参数值的类型。
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;
//编写自定义的校验器
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {
private Set<Integer> set=new HashSet<Integer>();
//初始化方法
@Override
public void initialize(ListValue constraintAnnotation) {
@Override
public void initialize(ListValue constraintAnnotation) {
for (int i : constraintAnnotation.vals()) {
set.add(i);
}
}
/**
* 判断是否校验成功
* @param value 需要校验的值
* @param context
* @return
*/
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
return set.contains(value);
}
}
2、 编写注解,参考其他的注解,把必须要有的都拷贝进来。
@Documented
@Constraint(validatedBy = { ListValueConstraintValidator.class })
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface ListValue {
// 使用该属性去Validation.properties中取
String message() default "{com.znan.common.valid.ListValue.message}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
int[] vals() default {};
}
3、在web项目的Dto中加上自定义的注解,然后在Controller控制器上的请求方法的参数前加上@Valid或@Validated即可。
package com.znan.webmvc.Dto;
import com.znan.webmvc.annotation.ListValue;
import com.znan.webmvc.po.Dog;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
public class PersonReqDto {
@NotNull(message = "id不能为空")
private Integer id;
@NotBlank(message = "用户名不能为空")
private String userName;
@ListValue(vals = {1, 2}, message = "sex的值有误")
private Integer sex;
@NotEmpty
private List<Dog> dogList;
}
package com.znan.webmvc.controller;
import com.znan.webmvc.Dto.PersonReqDto;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
@RestController
@RequestMapping("/persons")
public class PersonController {
@PostMapping
public void add(@Valid @RequestBody PersonReqDto reqDto){
System.out.println("........");
}
}
四、注意事项
String类型的参数不要使用@NotNull做检验,因为校验不会生效。
如果在Dto中加了上述的注解,需要在控制器Controller中加入@Valid或@Validated注解,这样校验才会生效。