SpringBoot校验List失效解决方法

SpringBoot校验List失效解决方法

失效场景示例代码:

@RestController
@RequestMapping("/v1/jx/flowSummary")
@Slf4j
public class JxFlowSummaryController {

    @Operation(summary = "批量修改原始得分")
    @PostMapping("/updateScore")
    public ResponseDto batchUpdateScore(@RequestBody @Valid List<BatchUpdateScoreDto> dtoList) {
        // jxFlowSummaryService.batchUpdateScore(dtoList);
        return ResponseUtil.wrapSuccess(null);
    }
}

解决方法一:在controller上加上@Validated注解

@RestController
@RequestMapping("/v1/jx/flowSummary")
@Slf4j
@Validated
public class JxFlowSummaryController {

    @Operation(summary = "批量修改原始得分")
    @PostMapping("/updateScore")
    public ResponseDto batchUpdateScore(@RequestBody @Valid List<BatchUpdateScoreDto> dtoList){
        return ResponseUtil.wrapSuccess(null);
    }
}

解决方法一:校验效果如下
在这里插入图片描述

解决方法二:自定义实现一个ValidatedList,接口参数使用ValidatedList

import lombok.Data;
import javax.validation.Valid;
import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;

/**
 * 自定义校验list
 *
 * @author liquanhong
 * @createTime 2023/11/23
 */
@Data
public class ValidatedList<E> implements List<E>, Serializable {

    @Valid
    private List<E> list = new LinkedList<>();

    @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);
    }
}

// List改为了 ValidatedList
@Operation(summary = "批量修改原始得分")
 @PostMapping("/updateScore")
 public ResponseDto batchUpdateScore(@RequestBody @Valid ValidatedList<BatchUpdateScoreDto> dtoList){
     return ResponseUtil.wrapSuccess(null);
 }

解决方法二:校验效果如下
在这里插入图片描述

附:校验基本数据类型和String类型的方法参数时也需要在类上加@Validated

参考链接

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要校验多个列表是否相同,可以按照以下步骤: 1. 定义一个自定义注解,用于标注需要校验的列表。例如: ```java @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Constraint(validatedBy = ListValidator.class) public @interface SameList { String message() default "Lists are not same"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } ``` 2. 定义一个校验器,用于校验被@SameList注解标注的字段。例如: ```java public class ListValidator implements ConstraintValidator<SameList, List<?>> { @Override public boolean isValid(List<?> value, ConstraintValidatorContext context) { if (value == null || value.size() == 0) { return true; } // 判断多个列表是否相同 // ... return true; // 返回校验结果 } } ``` 3. 在需要校验的实体类中,使用@SameList注解标注需要校验的列表。例如: ```java public class MyEntity { @SameList private List<String> list1; @SameList private List<Integer> list2; // getters and setters } ``` 4. 在需要进行校验的地方,使用Spring Boot提供的@Valid注解进行校验。例如: ```java @RestController public class MyController { @PostMapping("/myapi") public ResponseEntity<?> myApi(@RequestBody @Valid MyEntity myEntity) { // 处理请求 return ResponseEntity.ok().build(); } } ``` 在以上示例中,@Valid注解将会触发Spring Boot自动校验MyEntity对象中被@SameList注解标注的字段。如果列表不相同,则校验将失败,并且会抛出异常。否则,校验将会通过,程序将会继续执行。 ### 回答2: 可以通过比较多个List的大小、元素以及顺序来校验它们是否一样。下面是一个使用Spring Boot校验多个List是否一样的示例代码: ```java import java.util.ArrayList; import java.util.List; public class ListComparator { public static boolean compareLists(List<?> list1, List<?> list2) { if (list1 == null && list2 == null) { return true; } if ((list1 == null && list2 != null) || (list1 != null && list2 == null)) { return false; } if (list1.size() != list2.size()) { return false; } for (int i = 0; i < list1.size(); i++) { if (!list1.get(i).equals(list2.get(i))) { return false; } } return true; } public static void main(String[] args) { List<Integer> list1 = new ArrayList<>(); list1.add(1); list1.add(2); list1.add(3); List<Integer> list2 = new ArrayList<>(); list2.add(1); list2.add(2); list2.add(3); List<Integer> list3 = new ArrayList<>(); list3.add(1); list3.add(2); list3.add(4); System.out.println(compareLists(list1, list2)); // 输出 true System.out.println(compareLists(list1, list3)); // 输出 false } } ``` 以上代码中的`compareLists`方法用于比较两个List是否一样,在比较过程中,首先检查两个List是否同时为空或同时不为空,然后比较它们的大小是否一致,最后逐个比较元素是否相等。在`main`方法中,我们创建了几个不同的List,并使用`compareLists`方法进行比较,最终输出比较结果。在本示例中,`list1`和`list2`的元素相同,而`list1`和`list3`的元素不同,所以比较结果分别为true和false。 以上是通过比较List的大小、元素以及顺序来校验多个List是否一样的方法,你也可以根据实际需求自定义校验规则。 ### 回答3: 在Spring Boot中,我们可以使用CollectionUtils工具类来校验多个List是否一样。 首先,我们需要导入spring-boot-starter-validation依赖,该依赖包含了Hibernate Validator校验框架。 然后,我们可以定义一个自定义的校验注解,用于校验多个List是否一样。例如: ```java @Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = ListEqualsValidator.class) public @interface ListEquals { String message() default "Lists are not equal"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } ``` 接下来,我们需要实现一个校验ListEqualsValidator,用于校验多个List是否一样。例如: ```java public class ListEqualsValidator implements ConstraintValidator<ListEquals, List<?>> { @Override public boolean isValid(List<?> value, ConstraintValidatorContext context) { return CollectionUtils.isEqualCollection(value); } } ``` 最后,我们可以在需要校验的类上使用@ListEquals注解进行校验。例如: ```java @ListEquals public class MyListValidation { private List<String> list1; private List<String> list2; // getter and setter } ``` 在使用时,我们可以通过调用Validator进行校验。例如: ```java @Autowired private Validator validator; public void validate(MyListValidation myListValidation) { Set<ConstraintViolation<MyListValidation>> violations = validator.validate(myListValidation); if (!violations.isEmpty()) { // 校验不通过,做相应处理 } } ``` 以上就是使用Spring Boot校验多个List是否一样的简单步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值