1 Overview
spring-boot-starter-validation is a Starter for using Java Bean Validation with Hibernate Validator
see more in https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using.build-systems.starters
Bean Validation 源于JSR-303 ,而 JSR303 是 Java EE 6 中的一项子规范。JSR349、JSR380 是其升级版,添加了一些新的特性。Oracle 公司传统艺能,一流公司定标准,它们只定义了一些校验注解(Constraint),如@Null@NotNull@Pattern],位于javax.validation.constraints
包下,只提供 规范standard/specification 不提供实现implementation。
Hibernate Validator 是对这个 specification 的 implemantation(不要和数据库ORM 框架 Hibernate 联系在一起),并增加了一些自定义校验注解,如@Email、@Length、@Range,位于 org.hibernate.validator.constraints
包下。
2 Meaning of Annotations
annotation | meaning |
---|---|
@NotNull | Can not be null |
@NotBlank | 1.Can not be null; 2.Must contain at least one non-whitespace character 3.Accept str |
@NotEmpty | 1 not null 2.not empty 3.Accept type[string, collection] |
3 Basic Use
spring boot version | validation dependency |
---|---|
<2.3.x | spring-boot-starter-web TRANSIT validation dependency |
>2.3.x | Need to import spring-boot-starter-validation MANUALLY |
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
Entity Layer
class Brand{
@NotNull
private Long brandId;
@NotBlank
private String name;
@NotBlank
private String logo;
private String description;
@Min(0)
private Integer sort;
}
Controller layer
Essentially there are 3 ways to carry on request param:
- POST Request Body;
- GET PathVariable (如/foos/{id});
- GET Query Param(如url?q=param)
上面三种基本覆盖了大部分的开发场景
Add @Valid
:
@RestController
public class BrandController {
@PostMapping("/jsr303/pmsBrand")
public ResponseEntity<BrandResp> insertBrand(@Valid @RequestBody RequestParam param) {
return ResponseEntity.ok(this.pmsBrandService.insert(pmsBrand));
}
}
此种情形@Valid和@Validated两个可混用
If validation falled:
{
"timestamp": "2020-07-30T10:18:19.435+00:00",
"status": 400,
"error": "Bad Request",
"message": "",
"path": "/validateBody"
}
3 Group Validation
通常,某些 Java Bean 在不同的请求之间共享。以典型的 CRUD 操作为例:Create request 和 Update request 很可能都采用 same XxxReq 作为 input。However, distinct validation will be triggered on different situations.
Entity Layer
class Brand {
@NotNull(groups = OnCreate.class)
@Null(groups = OnUpdate.class)
private Long brandId;
@NotBlank(groups = {OnCreate.class, OnUpdate.class})
private String name;
// 仅仅作为一个标记接口
public interface OnUpdate{}
public interface OnCreate{}
}
注意这时 String name 这种原来不需要写 group 的现在也必须写上 group。Otherwise @NotBlank won’t set in.
Controller Layer
@PostMapping("/save")
public ResponseEntity<PmsBrand> add(@Validated(OnCreate.class) @RequestBody PmsBrand pmsBrand){
return ResponseEntity.ok(pmsBrandService.insert(pmsBrand));
}
只有@Validated才支持分组校验,所以这里必须使用@Validated,不能用@Valid替换
参考资料
作者:鱼找水需要时间
链接:https://juejin.cn/post/7189161523632144444
来源:稀土掘金