一属韧、背景
在項(xiàng)目開(kāi)發(fā)過(guò)程中安拟,經(jīng)常會(huì)對(duì)一些字段進(jìn)行校驗(yàn),比如字段的非空校驗(yàn)宵喂、字段的長(zhǎng)度校驗(yàn)等糠赦,如果在每個(gè)需要的地方寫(xiě)一堆if else 會(huì)讓你的代碼變的冗余笨重且相對(duì)不好維護(hù),如何更加規(guī)范和優(yōu)雅的校驗(yàn)?zāi)兀?/p>
Spring Boot中可以使用Validation Api和Hibernate Validator實(shí)現(xiàn)接口入?yún)⒆詣?dòng)檢驗(yàn)锅棕。
二拙泽、使用
1、如果成員變量是其他對(duì)象實(shí)體裸燎,該變量必須加 @Valid
顾瞻,否則嵌套中的驗(yàn)證不生效
2、添加依賴(lài):Spring Boot項(xiàng)目工程依賴(lài)顺少,因?yàn)樵趕pring-boot-starter-web中已經(jīng)包含了validation-api和hibernate-validator,所以無(wú)需再額外引用
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/>
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Maven項(xiàng)目工程依賴(lài)maven
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
</dependency>
3、首先需要了解javax.validation下的三個(gè)非空約束注解的作用位置:@NotNull脆炎、@NotEmpty梅猿、@NotBlank
約束 | 說(shuō)明 |
---|---|
@NotNull | 作用在Integer上(包括其它基礎(chǔ)類(lèi)),在Integer屬性上加上@NotNull約束后秒裕,該屬性不能為null几蜻,沒(méi)有size的約束梭稚;@NotNull作用在Collection弧烤、Map或者集合對(duì)象上暇昂,該集合對(duì)象不能為null,但可以是空集从铲,即size=0(一般在集合對(duì)象上用@NotEmpty約束) |
@NotBlank | 只作用在String上,在String屬性上加上@NotBlank約束后吉嫩,該屬性不能為null且trim()之后size>0 |
@NotEmpty | @NotEmpty 作用在集合類(lèi)上面嗅定,在Collection忙迁、Map姊扔、數(shù)組上加上@NotEmpty約束后恰梢,該集合對(duì)象是不能為null的嵌言,并且不能為空集摧茴,即size>0 |
三苛白、舉例
Controller類(lèi):
public class CustomerSyncController {
/**
* 客戶(hù)同步
*/
@ApiOperation(value = "客戶(hù)同步")
@PostMapping(value = "/customer/sync")
public Result<Boolean> syncCustomerInfo(@RequestBody @Valid CustomerInfoVo paramVos) {
try {
if (!ObjectUtils.isEmpty(paramVos)) {
customerInfoService.syncCustomerInfo(paramVos);
}
} catch (Exception e) {
e.printStackTrace();
log.error("[syncCustomerInfo] request error懂版,paramVos:{},異常:{}", paramVos, e.getMessage());
return Result.error(BasicCodeMsg.SERVER_ERROR);
}
return Result.success(Boolean.TRUE);
}
}
實(shí)體類(lèi):
@NoArgsConstructor
@Data
public class CustomerInfoVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "客戶(hù)id")
@NotBlank(message = "客戶(hù)ID不能為空")
private String customerId;
@ApiModelProperty(value = "客戶(hù)姓名")
@NotBlank(message = "客戶(hù)姓名不能為空")
private String name;
@ApiModelProperty(value = "證件類(lèi)型")
@NotNull(message = "證件類(lèi)型不能為空")
private Integer certificateType;
@ApiModelProperty(value = "證件號(hào)")
@NotBlank(message = "證件號(hào)不能為空")
private String certificate;
}
用postman測(cè)試即可。