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

如何使用Javax Validation校验List中的每个String元素?

解决List中每个元素的校验问题

要实现List中每个String元素的邮箱格式校验,需按以下步骤操作:

1. 确认依赖版本支持泛型校验

泛型参数的校验是**Bean Validation 2.0(JSR-380)**新增特性,需使用支持该版本的校验实现,比如Hibernate Validator 6.0.1.Final及以上版本。Maven依赖示例:

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.2.5.Final</version>
</dependency>

2. 实体类的正确写法

在List字段上添加@Valid注解(触发集合元素校验),同时在泛型参数String上标注@Email,注意@Valid需直接修饰List字段:

import javax.validation.Valid;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;

public class Info {
    @NotNull
    @NotEmpty
    @Valid
    private List<@Email(message = "邮箱格式不正确") String> emails;

    // getter、setter 省略
}

3. 触发校验的方式

原生Bean Validation校验

通过Validator接口执行对象校验:

import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.Set;

public class ValidationDemo {
    public static void main(String[] args) {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();

        Info info = new Info();
        info.setEmails(List.of("test@example.com", "invalid-email"));

        Set<?> violations = validator.validate(info);
        violations.forEach(System.out::println);
        // 会输出"invalid-email"对应的格式错误信息
    }
}

Spring环境下的校验

在Controller参数上添加@Valid或@Validated注解,自动触发校验:

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;

@RestController
public class InfoController {
    @PostMapping("/info")
    public String submit(@Valid @RequestBody Info info) {
        return "success";
    }
}

之前写法无效的原因

  • 第一种写法未添加@Valid:Bean Validation不会自动遍历List元素执行校验,必须通过@Valid触发集合内部元素的校验逻辑。
  • 第二种写法@Valid位置错误:将@Valid加在泛型前(private @Valid List<...>)无法生效,@Valid需直接修饰List字段本身。

内容的提问来源于stack exchange,提问作者Arzybek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:35:19