update jsr303

This commit is contained in:
2025-02-18 18:33:43 +08:00
parent 4cab80f831
commit 133b32989c
2 changed files with 80 additions and 177 deletions

View File

@ -2,7 +2,7 @@
JSR303是Java为Bean数据合法性校验提供给的标准框架已经包含在 JavaEE6.0 中、JSR303通过在Bean 属性中标注类似 @NotNull @Max 等标准的注解指定校验规则并通过标准的验证接口对 Bean进行验证
### 注解
### JSR303中含有的注解
@ -22,6 +22,8 @@
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
```
#### Hibernate Validator 附加的注解
```
@ -34,21 +36,82 @@
HIbernate Validator是JSR303的一个参考实现除了支持所有标准的校验注解外另外HIbernate Validator还有JSR-380的实现
```
### 静态工具 手动校验BEAN
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
AirportDTO dto = new AirportDTO();
dto.setIataCode("PKX");
dto.setThroughput("-1"); // 符合条件
// data.setValue(1234567.789); // 不符合条件整数部分超过6位
// data.setValue(123456.78901); // 不符合条件小数部分超过4位
// data.setValue(-123.45); // 不符合条件小于0
Set<ConstraintViolation<AirportDTO>> validate = validator.validate(dto,Update.class);
for (ConstraintViolation<AirportDTO> violation : validate) {
System.out.println(violation.getMessage());
}
}
### @Validated @Valid 有什么区别
`@Validated` 是spring 中提供的注解用于在添加该注解的方法、类上触发bean 校验。
`@Valid` java自身的注解 用于校验嵌套对象在spring 环境中添加该注解同样会触发bean 校验)。
### 对象嵌套校验
@Valid 校验嵌套对象
```java
public class Project {
@NotBlank(message = "Project title must be present")
@Size(min = 3, max = 20, message = "Project title size not valid")
private String title;
@Valid // 校验嵌套的对象
private User owner;
}
public class User {
// 校验规则
@NotBlank(message = "User name must be present")
@Size(min = 3, max = 50, message = "User name size not valid")
private String name;
// 校验规则
@NotBlank(message = "User email must be present")
@Email(message = "User email format is incorrect")
private String email;
}
```
@Valid 校验可迭代对象
```java
// @Valid 定义在容器对象上
@Valid
private List<Task> tasks;
// @Valid (JSR303注解也可以)定义在泛型参数上
private List<@Valid Task> tasks;
private Map<@Valid User, @Valid Task> assignedTasks;
```
### Validator Api 手动校验BEAN
```java
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
AirportDTO dto = new AirportDTO();
dto.setIataCode("PKX");
dto.setThroughput("-1"); // 符合条件
// data.setValue(1234567.789); // 不符合条件整数部分超过6位
// data.setValue(123456.78901); // 不符合条件小数部分超过4位
// data.setValue(-123.45); // 不符合条件小于0
Set<ConstraintViolation<AirportDTO>> validate = validator.validate(dto,Update.class);
for (ConstraintViolation<AirportDTO> violation : validate) {
System.out.println(violation.getMessage());
}
```