三、扩展
分组校验
如果一个类, 在不同的场景下有不同的校验规则, 那么就可以使用分组校验, 分组校验只能只用@Validated注解。
/**
* 分组校验Bean,在constraint上设置groups属性
*/
@Data
public class GroupProp {
@NotNull
@DecimalMin(value = "0", groups = {ValidatedGroupA.class})
@DecimalMin(value = "10", groups = {ValidatedGroupB.class})
private Long id;
}
@RestController
@RequestMapping("validate")
@Slf4j
public class ValidatedGroupController {
/**
* 分组校验只能使用@Validated
* @param groupProp
* @return
*/
@RequestMapping("groupA")
public Result validatedGroupA(@Validated(ValidatedGroupA.class) GroupProp groupProp) {
return ResultUtil.success(groupProp);
}
@RequestMapping("groupB")
public Result validatedGroupB(@Validated(ValidatedGroupB.class) GroupProp groupProp) {
return ResultUtil.success(groupProp);
}
}
嵌套校验
需要校验的bean中的成员属性为封装类型,且也需要校验的情况,在该成员属性上添加@Valid注解
/**
* Valid 嵌套验证
*/
@Data
public class ValidItem extends Item {
@Valid
@NotNull(message = "prop cannot be null")
private Prop prop;
}
@Data
public class Prop {
@NotNull
@Min(value = 1)
private Long pId;
@NotBlank
private String pName;
}
自定义校验
/**
* 定义注解
*
*/
@Target({ElementType.FIELD})
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = StatusValidator.class)
public @interface Status {
//必须
String message() default "Invalid status";
//必须
Class<?>[] groups() default {};
//必须
Class<? extends Payload>[] payload() default {};
}
/**
* 校验器
*/
public class StatusValidator implements ConstraintValidator<Status, String> {
@Override
public void initialize(Status constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (StringUtils.equals(value, "true")) {
return true;
} else if (StringUtils.equals(value, "false")) {
return true;
}
return false;
}
}