背景:
-
我們的接口是一個List對象,對象里面的數(shù)據(jù)基本都有一些基礎(chǔ)數(shù)據(jù)校驗的注解,我們怎么樣才能校驗這些基礎(chǔ)規(guī)則呢?
-
我們在導(dǎo)入excel文件進行數(shù)據(jù)錄入的時候,數(shù)據(jù)錄入也有基礎(chǔ)的校驗規(guī)則,這個時候我們又該如何少寫代碼讓Validation框架來幫我們完成這些基礎(chǔ)校驗?zāi)兀?/p>
帶著這個疑問,喊一句:翠花,上酸菜。
正文
首先定義我們的Validation的基礎(chǔ)類,基礎(chǔ)類只有一個字段:errMsg,用于我們校驗不通過時候存儲我們的提示信息:
@Data
public class ValidationBaseDTO {
private String errMsg;
}
然后定義我們的測試對象類,搞一個簡單的,這個DTO集成我們的校驗基礎(chǔ)類
@Data
public class ValidationTestDTO extends ValidationBaseDTO {
@NotEmpty(message = "用戶名不允許為空!")
private String userName;
@NotEmpty(message = "用戶code不允許為空")
private String userCode;
private int age;
}
然后編寫咱們的校驗工具類:
public class ValidationUtils{
public static <E, T extends ValidationBaseDTO> List<T> validate(Validator validator, E e) {
return validate(validator, e, Default.class);
}
public static <E, T extends ValidationBaseDTO> List<T> validate(Validator validator, E e, Class<?> groupClass) {
Set<ConstraintViolation<E>> set = validator.validate(e, groupClass);
if (CollectionUtils.isEmpty(set)) {
return null;
}
Map<String, List<ConstraintViolation<E>>> resultGroup = set.stream().collect(Collectors.groupingBy(item -> item.getPropertyPath().toString().substring(0, item.getPropertyPath().toString().indexOf("."))));
return resultGroup.entrySet().stream().map(item -> {
T targetObject = (T)item.getValue().get(0).getLeafBean();
String errMsg = String.join("|", item.getValue().stream().map(ConstraintViolation<E>::getMessage).collect(Collectors.toList()));
targetObject.setErrMsg(errMsg);
return targetObject;
}).collect(Collectors.toList());
}
}
校驗工具類有了,那還得搞一個測試用的Controller
@Slf4j
@RestController
@RequestMapping(value = "validation")
@AllArgsConstructor
public class ValidationTestController {
private final Validator validator;
@RequestMapping(value = "validationTest")
public CommonResult<List<ValidationTestDTO>> validationTest() {
// 例如我們通過Excel導(dǎo)入的數(shù)據(jù)有兩條,屬性全為空
ValidationTestDTO validationTestDTO1 = new ValidationTestDTO();
ValidationTestDTO validationTestDTO2 = new ValidationTestDTO();
List<ValidationTestDTO> validationTestDTOList = new ArrayList<>();
validationTestDTOList.add(validationTestDTO1);
validationTestDTOList.add(validationTestDTO2);
// 校驗結(jié)果如果為空,則說明全部通過,如果不為空,則說明有的校驗沒有通過
List<ValidationTestDTO> resultList = ValidationUtils.validate(validator, new ValidatedList<>(validationTestDTOList));
return ResultUtil.success(resultList);
}
}
這里不得不提的就是,Validator 在Spring框架里面是有被實例化的,且由Sping框架管理,我們直接注入就可以了
差點忘了,如果需要校驗List,我們還需要自定義一個ValidationList類,如下:
public class ValidatedList<E> implements List<E>, Serializable {
public ValidatedList(List<E> eList){
this.list = eList;
}
@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);
}
}
如果這個類不定義,直接傳入我們請求參數(shù)的List,那是無效的;
啟動,看效果:
文章來源:http://www.zghlxwxcb.cn/news/detail-705216.html
添加圖片注釋,不超過 140 字(可選)文章來源地址http://www.zghlxwxcb.cn/news/detail-705216.html
到了這里,關(guān)于文件導(dǎo)入之Validation校驗List對象數(shù)組的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!