@Valid 注解校验提交的List(list 集合) javax.validation.Valid

遇到需直接提交list集合的接口需求,不想单独创建只有一个list集合的pojo,普通方法无法校验。网上找到好用的方法,创建ValidList并用@Valid注解里面的list,在controller里使用,成员变量添加注解进行校验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遇到需要直接提交一个list集合的接口需求  不想单独在创建个只有一个list集合pojo 那普通的用反就没法校验了 但是在网上搜到了个方法很好用 本来应该贴一下原链接 但是我一时手贱给页面关了 打开的网页太多 又不好找了。在此给参考的大佬谢罪了。

好了 上代码了

  • 创建ValidList  用@Valid注解里面的list

import lombok.Data;

import javax.validation.Valid;
import java.util.*;

@Data
public class ValidList<E> implements List<E> {

    @Valid
    private List<E> list = new ArrayList<>() ;//这里看需要实例化需要的List类型

    @Override
    public int size() {
        return list.size();
    }

    @Override
    public boolean isEmpty() {
        return list.isEmpty();
    }

    @Override
    public boolean contains(Object o) {
        return list.contains(o);
    }

    @Override
    public Iterator<E> iterator() {
        return list.iterator();
    }

    @Override
    public Object[] toArray() {
        return list.toArray();
    }

    @Override
    public <T> T[] toArray(T[] a) {
        return list.toArray(a);
    }

    @Override
    public boolean add(E e) {
        return list.add(e);
    }

    @Override
    public boolean remove(Object o) {
        return list.remove(o);
    }

    @Override
    public boolean containsAll(Collection<?> c) {
        return list.containsAll(c);
    }

    @Override
    public boolean addAll(Collection<? extends E> c) {
        return list.addAll(c);
    }

    @Override
    public boolean addAll(int index, Collection<? extends E> c) {
        return list.addAll(index, c);
    }

    @Override
    public boolean removeAll(Collection<?> c) {
        return list.removeAll(c);
    }

    @Override
    public boolean retainAll(Collection<?> c) {
        return list.retainAll(c);
    }

    @Override
    public void clear() {
        list.clear();
    }

    @Override
    public E get(int index) {
        return list.get(index);
    }

    @Override
    public E set(int index, E element) {
        return list.set(index, element);
    }

    @Override
    public void add(int index, E element) {
        list.add(index, element);
    }

    @Override
    public E remove(int index) {
        return list.remove(index);
    }

    @Override
    public int indexOf(Object o) {
        return list.indexOf(o);
    }

    @Override
    public int lastIndexOf(Object o) {
        return list.lastIndexOf(o);
    }

    @Override
    public ListIterator<E> listIterator() {
        return list.listIterator();
    }

    @Override
    public ListIterator<E> listIterator(int index) {
        return list.listIterator(index);
    }

    @Override
    public List<E> subList(int fromIndex, int toIndex) {
        return list.subList(fromIndex, toIndex);
    }
}
  •  controller里面使用
public void test(@Valid @RequestBody ValidList<User> users, BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            //把错误信息组成一个String集合
            List<String> error = ValidateHelper.getError(bindingResult); 
        }
    ****
}


//工具类里一个方法 将校验错误的信息放到List<String>中 
public static List<String> getError(BindingResult bindingResult){
        List<ObjectError> allErrors = bindingResult.getAllErrors();
        List<String> error=new ArrayList<>();
        for (ObjectError item:allErrors){
            error.add(item.getDefaultMessage());
        }
        return error;
}
  • 具体的User实体里面咋校验就不说了   自己看着用吧 成员变量上加下面注解
   @NotEmpty(message = "Id 不能为空")
   @Size(max=50,message = "Id 最大长度50")

 

### 关于 `javax.validation.constraints.NotEmpty` 验证器无法应用于 `List<String>` 类型的问题 在 Java 的 `javax.validation.constraints` 包中,`@NotEmpty` 注解用于验证目标字段是否为空。对于集合类型(如 `List<String>`),`@NotEmpty` 通常可以正常工作,但某些情况下可能会出现验证失败或抛出异常的情况。以下是对该问题的详细分析和解决方案。 #### 1. **问题的根本原因** 当使用 `@NotEmpty` 验证 `List<String>` 类型时,如果出现类似 `HV000030: No validator could be found for constraint 'javax.validation.constraints.NotEmpty' validating type 'java.util.List<...>'` 的错误,通常是由于以下原因之一: - Hibernate Validator 版本与 Bean Validation API 版本不兼容[^3]。 - Bean Validation API 或 Hibernate Validator 的版本较低,不支持对复杂类型的验证[^4]。 #### 2. **解决方法** 以下是解决该问题的几种常见方法: ##### 方法一:升级 Hibernate Validator 和 Bean Validation API 确保使用的 Hibernate Validator 和 Bean Validation API 版本兼容且足够新。例如: ```xml <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.1.5.Final</version> </dependency> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency> ``` 通过升级到上述版本,可以解决大多数因版本不兼容导致的验证问题[^3]。 ##### 方法二:检查依赖冲突 如果项目中存在多个版本的 Hibernate Validator 或 Bean Validation API,可能会导致依赖冲突。可以通过以下命令检查依赖树并解决冲突: ```bash mvn dependency:tree ``` 确保最终引入的版本是正确的。 ##### 方法三:使用自定义验证器 如果升级依赖仍无法解决问题,可以创建一个自定义验证器来实现对 `List<String>` 的非空校验。例如: ```java import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.util.Collection; public class NonEmptyListValidator implements ConstraintValidator<NotEmpty, Collection<?>> { @Override public boolean isValid(Collection<?> value, ConstraintValidatorContext context) { return value != null && !value.isEmpty(); } } ``` 然后,在需要验证的字段上使用自定义注解: ```java import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.RetentionPolicy.RUNTIME; @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE}) @Retention(RUNTIME) @Constraint(validatedBy = NonEmptyListValidator.class) @Documented public @interface NonEmptyList { String message() default "List must not be empty"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } ``` ##### 方法四:检查配置文件 如果使用的是 Spring Boot 框架,确保 `application.properties` 或 `application.yml` 中没有错误配置。例如: ```yaml spring: cloud: gateway: routes: - id: example_route uri: http://example.com predicates: - Path=/example/** ``` 如果 `predicates` 被标记为 `@NotEmpty`,但实际值为空或未正确初始化,则会导致验证失败[^3]。 #### 3. **代码示例** 以下是一个完整的代码示例,展示如何正确使用 `@NotEmpty` 验证 `List<String>` 类型: ```java import javax.validation.constraints.NotEmpty; import java.util.List; public class Example { @NotEmpty(message = "The list must not be empty") private List<String> items; public List<String> getItems() { return items; } public void setItems(List<String> items) { this.items = items; } } ``` #### 4. **总结** `@NotEmpty` 验证器无法应用于 `List<String>` 类型的问题,通常是由依赖版本不兼容、配置错误或依赖冲突引起的。通过升级 Hibernate Validator 和 Bean Validation API 到最新版本,或者创建自定义验证器,可以有效解决此类问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值