SpringBoot参数校验List类型参数校验

编程

遇到的问题:

今天开发接口,遇到请求参数固定为List<SaveVideoReq>类型的,如下。发现参数校验失效。

 // 控制器

@RequestMapping(value = "/saveVideo", method = RequestMethod.POST)

@ResponseBody

public List<SaveVideoResp> saveVideo(@Validated @RequestBody List<SaveVideoReq> req, BindingResult bindingResult) {

// 省略业务代码

}

// VO

public class SaveVideoReq implements Vo {

private static final long serialVersionUID = 1L;

@NotBlank(message = "系统编号不能为空")

private String sysNo;

@NotBlank(message = "影像类型不能为空")

private String videoType;

@NotBlank(message = "影像名称不能为空")

private String videoName;

}

解决方案一:

新建一个类,把List<SaveVideoReq>作为成员变量, 然后用@Valid注解在List上。

public class SaveVideoReqWrapper implements Vo {

@Valid

private List<SaveVideoReq> req;

}

为了能够进行嵌套验证,必须手动在req字段上明确指出这个字段里面的实体也要进行验证。由于@Validated不能用在成员属性(字段)上,但是@Valid能加在成员属性(字段)上,而且@Valid类注解上也说明了它支持嵌套验证功能,那么我们能够推断出:@Valid加在方法参数时并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上,来配合方法参数上@Validated或@Valid来进行嵌套验证。

解决方案二:

但是,由于某种原因,前端只会传[{“sysNo”:“HIKID098”,“videoType”:“01”,“videoName":"高清小视频"},{...}]。因此,请求对象是固定的,不能用方案一处理。此时,可以参考网上的一个方法,创建一个类,实现List接口,并添加List<E> list = new ArrayList<>();或者LinkedList作为成员变量,如下:
 

/**

* FileName: ValidList

* DESCRIPTION: 参数校验工具类, 用于校验List<E> 类型的请求参数

* @author: SLY

* @create: 2019/3/5

*/

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

@Valid

private List<E> list = new ArrayList<>();

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

}

public List<E> getList() {

return list;

}

public void setList(List<E> list) {

this.list = list;

}

}

然后,控制器的参数列表就变成了如下。此时,就可以正常从bingdingResult获取校验结果了。

// 控制器

@RequestMapping(value = "/saveVideo", method = RequestMethod.POST)

@ResponseBody

public List<SaveVideoResp> saveVideo(@Validated @RequestBody ValidList<SaveVideoReq> req, BindingResult bindingResult) {

// 省略业务代码

}

方法二亲测有效

以上是 SpringBoot参数校验List类型参数校验 的全部内容, 来源链接: utcz.com/z/511292.html

回到顶部