How to use JSR303 and spring-boot-starter-validation

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

annotationmeaning
@NotNullCan not be null
@NotBlank1.Can not be null; 2.Must contain at least one non-whitespace character 3.Accept str
@NotEmpty1 not null 2.not empty 3.Accept type[string, collection]

3 Basic Use

spring boot versionvalidation dependency
<2.3.xspring-boot-starter-web TRANSIT validation dependency
>2.3.xNeed 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
来源:稀土掘金

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值