背景
使用java validation 框架,其中一个DTO对象的字段,在不同场景下校验规则不一样。
例如,比如update的时候id字段不能为空,而插入的时候不对id校验。
validation框架的groups属性
validation框架支持groups字段,解决这类问题。
- 新建接口类,用于validator分组。
public interface Insert {}
public interface Update {}
- 对validator配置groups属性
@Data
public class CameraDTO {
@NotBlank(groups={Update.class})
private String id;
// more codes
}
- 应用层使用@Validated和对应的groups。
spring应用
@Validated(Update.class) CameraDTO cameraDTO
普通java应用
@Test
public void test() {
Validator validator = Validation
.buildDefaultValidatorFactory().getValidator();
CameraDTO cameraDTO = new CameraDTO();
Set<ConstraintViolation<CameraDTO>> constraintViolations = validator.validate(cameraDTO, Update.class);
Assertions.assertEquals(1, constraintViolations.size());
}
@Valid 和 @Validated
这2个容易混淆。
@Valid是java validation标准。
package javax.validation;
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Valid {
}
@Validated是spring validation框架。
package org.springframework.validation.annotation;
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Validated {
Class<?>[] value() default {};
}
对比两者的@Target注解属性,@Valid应用范围更广。