• 文件导入之Validation校验List对象数组


    背景:

    • 我们的接口是一个List对象,对象里面的数据基本都有一些基础数据校验的注解,我们怎么样才能校验这些基础规则呢?

    • 我们在导入excel文件进行数据录入的时候,数据录入也有基础的校验规则,这个时候我们又该如何少写代码让Validation框架来帮我们完成这些基础校验呢?

    带着这个疑问,喊一句:翠花,上酸菜。

    正文

    首先定义我们的Validation的基础类,基础类只有一个字段:errMsg,用于我们校验不通过时候存储我们的提示信息:

    1. @Data
    2. public class ValidationBaseDTO {
    3. private String errMsg;
    4. }

    然后定义我们的测试对象类,搞一个简单的,这个DTO集成我们的校验基础类

    1. @Data
    2. public class ValidationTestDTO extends ValidationBaseDTO {
    3. @NotEmpty(message = "用户名不允许为空!")
    4. private String userName;
    5. @NotEmpty(message = "用户code不允许为空")
    6. private String userCode;
    7. private int age;
    8. }

    然后编写咱们的校验工具类:

    1. public class ValidationUtils{
    2. public static extends ValidationBaseDTO> List validate(Validator validator, E e) {
    3. return validate(validator, e, Default.class);
    4. }
    5. public static extends ValidationBaseDTO> List validate(Validator validator, E e, Class groupClass) {
    6. Set> set = validator.validate(e, groupClass);
    7. if (CollectionUtils.isEmpty(set)) {
    8. return null;
    9. }
    10. Map>> resultGroup = set.stream().collect(Collectors.groupingBy(item -> item.getPropertyPath().toString().substring(0, item.getPropertyPath().toString().indexOf("."))));
    11. return resultGroup.entrySet().stream().map(item -> {
    12. T targetObject = (T)item.getValue().get(0).getLeafBean();
    13. String errMsg = String.join("|", item.getValue().stream().map(ConstraintViolation::getMessage).collect(Collectors.toList()));
    14. targetObject.setErrMsg(errMsg);
    15. return targetObject;
    16. }).collect(Collectors.toList());
    17. }
    18. }

    校验工具类有了,那还得搞一个测试用的Controller

     
    
    1. @Slf4j
    2. @RestController
    3. @RequestMapping(value = "validation")
    4. @AllArgsConstructor
    5. public class ValidationTestController {
    6. private final Validator validator;
    7. @RequestMapping(value = "validationTest")
    8. public CommonResult> validationTest() {
    9. // 例如我们通过Excel导入的数据有两条,属性全为空
    10. ValidationTestDTO validationTestDTO1 = new ValidationTestDTO();
    11. ValidationTestDTO validationTestDTO2 = new ValidationTestDTO();
    12. List validationTestDTOList = new ArrayList<>();
    13. validationTestDTOList.add(validationTestDTO1);
    14. validationTestDTOList.add(validationTestDTO2);
    15. // 校验结果如果为空,则说明全部通过,如果不为空,则说明有的校验没有通过
    16. List resultList = ValidationUtils.validate(validator, new ValidatedList<>(validationTestDTOList));
    17. return ResultUtil.success(resultList);
    18. }
    19. }

    这里不得不提的就是,Validator 在Spring框架里面是有被实例化的,且由Sping框架管理,我们直接注入就可以了

    差点忘了,如果需要校验List,我们还需要自定义一个ValidationList类,如下:

    1. public class ValidatedList implements List, Serializable {
    2. public ValidatedList(List eList){
    3. this.list = eList;
    4. }
    5. @Valid
    6. private List list = new LinkedList<>();
    7. @Override
    8. public int size() {
    9. return list.size();
    10. }
    11. @Override
    12. public boolean isEmpty() {
    13. return list.isEmpty();
    14. }
    15. @Override
    16. public boolean contains(Object o) {
    17. return list.contains(o);
    18. }
    19. @Override
    20. public Iterator iterator() {
    21. return list.iterator();
    22. }
    23. @Override
    24. public Object[] toArray() {
    25. return list.toArray();
    26. }
    27. @Override
    28. public T[] toArray(T[] a) {
    29. return list.toArray(a);
    30. }
    31. @Override
    32. public boolean add(E e) {
    33. return list.add(e);
    34. }
    35. @Override
    36. public boolean remove(Object o) {
    37. return list.remove(o);
    38. }
    39. @Override
    40. public boolean containsAll(Collection c) {
    41. return list.containsAll(c);
    42. }
    43. @Override
    44. public boolean addAll(Collection c) {
    45. return list.addAll(c);
    46. }
    47. @Override
    48. public boolean addAll(int index, Collection c) {
    49. return list.addAll(index, c);
    50. }
    51. @Override
    52. public boolean removeAll(Collection c) {
    53. return list.removeAll(c);
    54. }
    55. @Override
    56. public boolean retainAll(Collection c) {
    57. return list.retainAll(c);
    58. }
    59. @Override
    60. public void clear() {
    61. list.clear();
    62. }
    63. @Override
    64. public E get(int index) {
    65. return list.get(index);
    66. }
    67. @Override
    68. public E set(int index, E element) {
    69. return list.set(index, element);
    70. }
    71. @Override
    72. public void add(int index, E element) {
    73. list.add(index, element);
    74. }
    75. @Override
    76. public E remove(int index) {
    77. return list.remove(index);
    78. }
    79. @Override
    80. public int indexOf(Object o) {
    81. return list.indexOf(o);
    82. }
    83. @Override
    84. public int lastIndexOf(Object o) {
    85. return list.lastIndexOf(o);
    86. }
    87. @Override
    88. public ListIterator listIterator() {
    89. return list.listIterator();
    90. }
    91. @Override
    92. public ListIterator listIterator(int index) {
    93. return list.listIterator(index);
    94. }
    95. @Override
    96. public List subList(int fromIndex, int toIndex) {
    97. return list.subList(fromIndex, toIndex);
    98. }
    99. }

    如果这个类不定义,直接传入我们请求参数的List,那是无效的;

    启动,看效果:

    添加图片注释,不超过 140 字(可选)

  • 相关阅读:
    AI 绘画 | Stable Diffusion 图生图
    前端面试的话术集锦第 7 篇:高频考点(浏览器渲染原理 & 安全防范)
    李沐:机器学习者进阶学习建议
    C++核心编程之类和对象---对象特性--- 构造函数和析构函数(对象的初始化和清理)
    优先队列题目:数据流的中位数
    数据结构之美:如何优化搜索和排序算法
    LCR 172.点名
    uniapp 轮播列表左右滑动,滑动到中间放大
    html入门综合练习
    Spark-机器学习(4)回归学习之逻辑回归
  • 原文地址:https://blog.csdn.net/Brady74/article/details/132769972