java Api请求参数嵌套类验证

Java Api设计中参数的校验是Api接口功能的重要组成部分;如何对嵌套实体类对校验呢?
比如:银行卡绑定功能Api,请求接口bingCard,请求实体UserRequest,UserReuest又嵌套了一个银行卡集合,绑定多张银行卡;

@PostMapping("/bind/card")
public String bindCard(@Valid @RequestBody UserRequest request){
        、、、相应处理
}
public class UserRequest{
        @NotNull(message = "用户名称不能为空")
    private String userName;

    @Valid
    @NotNull(message = "集合不为空")
    private List cards;
    、、、get,set方法
}
public class Card {

    @NotBlank(message = "银行卡不能为空")
    private String bankCard;
        、、、get,set方法
}

Java框架提供了@Valid注解,对我们的请求实体做了非空,长度,正则表达式等多种判断;
Spring 对这种验证规则做了注解校验Validated;他们的功能大致相同;

如果需要对UserRequest对象中的字段进行校验,加上@Valid 注解,如果同时需要对内部的Card对象字段也做验证,在List cards上也需要加上@Valid注解;

如果加载cards上的@Vliad没有起到验证效果,手动验证

@PostMapping("/bind/card2")
public String bindCard(@Valid @RequestBody UserRequest request){
        Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
        List cards = tb.getCards();
        for (Card card : cards) {
            Set> validates = validator.validate(card);
            StringBuffer sb = new StringBuffer();
            for(ConstraintViolation constraintViolation:validates) {
                sb.append("字段:"+constraintViolation.getPropertyPath().toString()
                +"--").append(constraintViolation.getMessage());
            }
            if(sb.length() > 0){
                throw new RuntimeException(sb.toString());
            }
        }
        、、、处理逻辑
}

这里获取Validator 验证器,对我们的参数直接进行验证,如果bankCard为空,就会抛出"字段:bankCard -- 银行卡不能为空"提示异常;

你可能感兴趣的:(java Api请求参数嵌套类验证)