记录一下@Validated校验参数是List集合的时候会失效的解决方案。
方案一(推荐)
定义一个ValidatedList集合,需要参数校验的时候把List改成ValidatedList即可
import lombok.Data;
import javax.validation.Valid;
import java.io.Serializable;
import java.util.*;@Data
public class ValidatedList<E> implements List<E>, Serializable {@Validprivate List<E> list = new LinkedList<>();@Overridepublic int size() {return list.size();}@Overridepublic boolean isEmpty() {return list.isEmpty();}@Overridepublic boolean contains(Object o) {return list.contains(o);}@Overridepublic Iterator<E> iterator() {return list.iterator();}@Overridepublic Object[] toArray() {return list.toArray();}@Overridepublic <T> T[] toArray(T[] a) {return list.toArray(a);}@Overridepublic boolean add(E e) {return list.add(e);}@Overridepublic boolean remove(Object o) {return list.remove(o);}@Overridepublic boolean containsAll(Collection<?> c) {return list.containsAll(c);}@Overridepublic boolean addAll(Collection<? extends E> c) {return list.addAll(c);}@Overridepublic boolean addAll(int index, Collection<? extends E> c) {return list.addAll(index, c);}@Overridepublic boolean removeAll(Collection<?> c) {return list.removeAll(c);}@Overridepublic boolean retainAll(Collection<?> c) {return list.retainAll(c);}@Overridepublic void clear() {list.clear();}@Overridepublic E get(int index) {return list.get(index);}@Overridepublic E set(int index, E element) {return list.set(index, element);}@Overridepublic void add(int index, E element) {list.add(index, element);}@Overridepublic E remove(int index) {return list.remove(index);}@Overridepublic int indexOf(Object o) {return list.indexOf(o);}@Overridepublic int lastIndexOf(Object o) {return list.lastIndexOf(o);}@Overridepublic ListIterator<E> listIterator() {return list.listIterator();}@Overridepublic ListIterator<E> listIterator(int index) {return list.listIterator(index);}@Overridepublic List<E> subList(int fromIndex, int toIndex) {return list.subList(fromIndex, toIndex);}
}
那么集合校验变成如下方式
@PostMapping("saveBatch")
public Result saveBatch(@RequestBody @Validated ValidList<ResultFieldDTO> list) {resultFieldService.saveBatch(list);return Result.ok();
}
方案二
controller上添加@Validated
@RestController
@RequestMapping("search")
@Validated
public class ResultFieldController {
......
}
那么集合校验变成如下方式
@PostMapping("saveBatch")
public Result saveBatch(@RequestBody @Valid List<ResultFieldDTO> list) {resultFieldService.saveBatch(list);return Result.ok();
}
方案三(不推荐)
新增一个实体类,把集合再放到这个实体类当成一个字段
@Data
public class VO{@Validprivate List<SzPicRecord> szPicRecords;}
那么集合校验变成如下方式
public AjaxResult addBatch(@RequestBody @Validated VO t) {}
总结
推荐使用方案一,另外如果集合中的元素对象字段还是集合,可以使用@Valid注解进行级联校验。
参考引用
SpringBoot关于List集合的校验方式