Validated参数校验框架(三)

断鸿 2020年03月05日 77次浏览

三、扩展

分组校验

如果一个类, 在不同的场景下有不同的校验规则, 那么就可以使用分组校验, 分组校验只能只用@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;
    }
}