You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:15:05