背景需求
controller接收参数是一个List< User >的集合,需要校验User中的name,password等属性。
之前操作
实体类上加@NotNull和@Pattern注解
public class BizAgentRewardInfo extends BaseEntity {
/**
* 主键
*/
private Long ruleId;
/**
* 收益类型
*/
private String ruleType;
/**
* 级别
*/
@NotBlank(message = "级别不能为空")
@Pattern(message = "请输入数字",regexp = "^[0-9]*$")
private String ruleLevel;
/**
* 最低值
*/
@NotNull(message = "最低值不能为空")
private Integer ruleMin;
/**
* 最高值
*/
@NotNull(message = "最高值不能为空")
private Integer ruleMax;
/**
* 比率
*/
@NotNull(message = "比率不能为空")
private BigDecimal ruleRatio;
但是对象被List包裹后,校验不生效
解决办法
上网搜索后,最好的方法是自定义一个ValidList类来接收前端传过来的参数
package com.xg.business.utils;
import javax.naming.ldap.PagedResultsControl;
import javax.validation.Valid;
import java.util.*;
/**
* 用ValidList接收前端参数,校验List<E> E类对象中的属性
*
*
*/
public class ValidList<E> implements List<E> {
@Valid
private List<E> list = new LinkedList<>();
public List<E> getList() {
return list;
}
public void setList(List<E> list) {
this.list = 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 new Object[0];
}
@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() {
}
@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) {
}
@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);
}
}
ValidList实现List接口中的所有方法,在类上加@Valid注解。同时controller中入参的注解不再用@Validated,改用@Valid
注意:自定义的ValidList类的方法返回值一定是返回原List的对应方法,实现后默认返回是0,false
定义为Long和Interger这些数据类型的属性不能用@Pattern做正则校验,会报错。简单的方法就是前端验证