如何使用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
相关产品推荐
相关产品推荐

