Java Vavr Validation含嵌套校验时返回Person列表的实现方法
基于Vavr Validation实现多层校验并返回Person列表的实现方案
你可以将单个请求的校验逻辑单独抽离,在遍历请求列表时逐一枚举校验,完全不需要依赖combine方法即可适配多层嵌套校验的场景。以下是和你原有fail fast(遇到第一个校验错误立即返回)逻辑对齐的实现:
import io.vavr.control.Validation; import java.util.ArrayList; import java.util.List; // 单个Person请求的校验方法,多层嵌套校验可以直接在该方法内逐层处理 private static Validation<ConstraintViolation, Person> validateSinglePerson(PersonRequest request) { // 基础字段校验 if (isNull(request.getName())) { return Validation.invalid(new ConstraintViolation("name", "name cannot be empty")); } // 嵌套对象校验示例,直接调用对应子对象的校验方法即可 if (request.getContact() != null) { Validation<ConstraintViolation, Contact> contactValid = validateContact(request.getContact()); if (contactValid.isInvalid()) { return Validation.invalid(contactValid.getError()); } } // 所有校验通过后构建Person对象返回 return Validation.valid(Person.builder() .name(request.getName()) // 其余字段赋值 .build()); } // 主校验方法 private static Validation<ConstraintViolation, List<Person>> validatePersonDetail( List<PersonDetailRequest> personRequest) { List<Person> validPersonList = new ArrayList<>(); for (PersonRequest request : personRequest) { Validation<ConstraintViolation, Person> singleResult = validateSinglePerson(request); // 遇到第一个校验失败直接返回 if (singleResult.isInvalid()) { return Validation.invalid(singleResult.getError()); } validPersonList.add(singleResult.get()); } // 所有请求校验通过,返回封装好的Person列表 return Validation.valid(validPersonList); }
如果你需要收集所有校验错误而非遇到第一个就返回,可以将Validation的错误类型调整为io.vavr.collection.Seq<ConstraintViolation>,遍历过程中累积所有错误,最后判断错误集合是否为空返回对应结果即可。
内容的提问来源于stack exchange,提问作者raaeusagvc
相关产品推荐
相关产品推荐

