1. 背景
プロジェクトの開発プロセスでは、フィールドが空でないことの検証、フィールドの長さの検証など、いくつかのフィールドが検証されることがよくありますが、必要なすべての場所に if else を大量に記述すると、コードが冗長になります。検証をより標準化され、洗練されたものにするにはどうすればよいでしょうか?
Spring Boot では、Validation API と Hibernate Validator を使用して、インターフェイス パラメーターの自動検証を実装できます。
2. 使用する
1. メンバー変数が別のオブジェクト エンティティである場合は、変数を追加する必要があります@Valid
。追加しないと、ネストされた検証は有効になりません。
2. 依存関係の追加: Spring Boot プロジェクトの依存関係。validation-api と hibernate-validator はすでに spring-boot-starter-web に含まれているため、追加の参照は必要ありません。
<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 プロジェクトは Maven に依存します
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
</dependency>
3. まず、javax.validation の 3 つの非 null 制約アノテーション (@NotNull、@NotEmpty、@NotBlank) の役割を理解する必要があります。
制約 | 説明する |
---|---|
@NotNull | Integer (他の基本クラスを含む) に作用します。@NotNull 制約を Integer 属性に追加した後、属性を null にすることはできず、サイズ制約はありません。@NotNull は Collection、Map、またはコレクション オブジェクトに作用し、コレクション オブジェクトを null にすることはできませんただし、空のセット、つまり size=0 にすることもできます (通常、コレクション オブジェクトには @NotEmpty 制約を使用します)。 |
@NotBlank | @NotBlank 制約を String 属性に追加した後は、trim() 後に属性を null および size>0 にすることはできません。 |
@空ではない | @NotEmpty はコレクション クラスで動作します。@NotEmpty 制約が Collection、Map、および配列に追加された後は、コレクション オブジェクトを null にすることも、空のセットにすることもできません (つまり、サイズ > 0)。 |
3. 例
コントローラークラス:
public class CustomerSyncController {
/**
* 客户同步
*/
@ApiOperation(value = "客户同步")
@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);
}
}
エンティティクラス:
@NoArgsConstructor
@Data
public class CustomerInfoVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "客户id")
@NotBlank(message = "客户ID不能为空")
private String customerId;
@ApiModelProperty(value = "客户姓名")
@NotBlank(message = "客户姓名不能为空")
private String name;
@ApiModelProperty(value = "证件类型")
@NotNull(message = "证件类型不能为空")
private Integer certificateType;
@ApiModelProperty(value = "证件号")
@NotBlank(message = "证件号不能为空")
private String certificate;
}
郵便配達員でテストしてください。