JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。
Hibernate Validator 是 Bean Validation 的参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。
注解 | 类型 | 描述 |
---|---|---|
@NotNull | 任何类型 | 属性不能为null |
@NotEmpty | 集合 | 集合不能为null,且size大于0 |
@NotBlank | 字符串、字符 | 字符类不能为null,且去掉空格之后长度大于0 |
@AssertTrue | Boolean | 布尔属性必须是true |
@Min | 数字类型 | 限定数字的最小值(整型) |
@Max | 同@Min | 限定数字的最大值(整型) |
@DecimalMin | 同@Min | 限定数字的最小值(字符串,可以是小数) |
@DecimalMax | 同@Min | 限定数字的最大值(字符串,可以是小数) |
@Range | 数字类型 | 限定数字范围(长整型) |
@Length | 字符串 | 限定字符串长度 |
@Size | 集合 | 限定集合大小 |
@Past | 时间、日期 | 必须是一个过去的时间或日期 |
@Future | 时期、时间 | 必须是一个未来的时间或日期 |
字符串 | 必须是一个邮箱格式 | |
@Pattern | 字符串、字符 | 正则匹配字符串 |
首先是引入依赖
<!-- JSR303 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.7.Final</version>
</dependency>
引入依赖后将我们要进行在controller进行校验的实体类进行注解的添加
import lombok.Data;
import javax.validation.constraints.*;
import java.io.Serializable;
@Data
public class TestDemo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 品牌id
*/
@NotNull(message = "修改品牌必须指定品牌Id")
private Long id;
/**
* 品牌名
*/
@NotBlank(message = "新增品牌名称必须提交")
private String name;
/**
* 介绍
*/
@NotNull(message = "修改品牌必须指定品牌Id")
private String descript;
/**
* 排序
*/
@NotNull
@Min(value=0,message = "排序字段不可小于0")
private Integer sort;
}
其次是在controller具体的接口方法上对参数添加注解@Validated
@PostMapping("/test1")
public Object test1(@Validated @RequestBody TestDemo testDemo) {
return true;
}
这里使用api调用工具看一下效果
在实体类上标注校验注解的时候,可以给groups属性进行赋值,然后在需要校验的controller类的方法中的实体类前加上@Validated注解,先附上代码再细细说明
public interface AddGroup {
}
public interface UpdateGroup {
}
这两个接口的作用就是仅用于标记,不需要有任何的方法声明。
由代码不难看出,每个注解后面我都加上了分组,groups里可以添加多个.class文件,标记对应分组,
这里id和sort这两个字段添加了注解,当在AddGroup分组下的id才会生效,而在UpdateGroup分组下只有sort的校验会生效。
当我调用test1方法时对数据进行校验字段只有id会生效,而当我调用test2方法时对数据进行校验字段只有sort生效,可以看一下效果
@Slf4j
@RestControllerAdvice(basePackages = "com.example.jsr303demo.controller")
public class JSRExceptionControllerAdvice {
@ExceptionHandler(value={MethodArgumentNotValidException.class})
public R handleValidException(MethodArgumentNotValidException e){
log.error("数据校验出现问题{},异常类型{}",e.getMessage(),e.getClass());
BindingResult bindResult = e.getBindingResult();
Map<String,Object> resultMap=new HashMap<>();
bindResult.getFieldErrors().forEach((errorFilad)->{
String defaultMessage = errorFilad.getDefaultMessage();
String field = errorFilad.getField();
resultMap.put(field,defaultMessage);
});
return R.error(400,"校验出现问题").put("data",errorMap);
}
@ExceptionHandler(value={Throwable.class})
public R handleException(Throwable e){
log.error("错误:",e);
return R.error(401,"未知异常");
}
}