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<Card> cards;
、、、get,set方法
}
public class Card {
@NotBlank(message = "银行卡不能为空")
private String bankCard;
、、、get,set方法
}
Java框架提供了@Valid注解,对我们的请求实体做了非空,长度,正则表达式等多种判断;
Spring 对这种验证规则做了注解校验Validated;他们的功能大致相同;
如果需要对UserRequest对象中的字段进行校验,加上@Valid 注解,如果同时需要对内部的Card对象字段也做验证,在List<Card> cards上也需要加上@Valid注解;
如果加载cards上的@Vliad没有起到验证效果,手动验证
@PostMapping("/bind/card2")
public String bindCard(@Valid @RequestBody UserRequest request){
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
List<Card> cards = tb.getCards();
for (Card card : cards) {
Set<ConstraintViolation<Card>> 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 -- 银行卡不能为空"提示异常;