码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Spring Boot 实现字段唯一校验


    目录

    1 Maven依赖

    2 实现代码

    2.1 UniqueCheck

    2.2 UniqueCheckDetail

    2.3 UniqueCheckArgs

    2.4 UniqueCheckService 

    2.5 AbstractUniqueCheckService

    3 调试代码

    3.1 UserCheckArgs 

    3.2 UserUniqueCheckVo 

    3.3 UserUniqueCheckService 

    3.4 UniqueCheckEnum 

    3.5 单元测试代码

    4 调试结果

     注:


    1 Maven依赖

    1. <dependency>
    2. <groupId>org.apache.commonsgroupId>
    3. <artifactId>commons-lang3artifactId>
    4. <version>3.9version>
    5. dependency>

    2 实现代码

    2.1 UniqueCheck

    1. package com.xudongbase.uniquecheck.annotation;
    2. import java.lang.annotation.ElementType;
    3. import java.lang.annotation.Retention;
    4. import java.lang.annotation.RetentionPolicy;
    5. import java.lang.annotation.Target;
    6. /**
    7. * 在指定的字段用此注解
    8. * 用来唯一校验
    9. *
    10. * @author xudongmaster
    11. */
    12. @Target({ElementType.FIELD})
    13. @Retention(RetentionPolicy.RUNTIME)
    14. public @interface UniqueCheck {
    15. /**
    16. * 字段的中文名
    17. *
    18. * @return
    19. */
    20. String cnName();
    21. /**
    22. * 提示
    23. *
    24. * @return
    25. */
    26. String tip() default "存在重复";
    27. }

    2.2 UniqueCheckDetail

    1. package com.xudongbase.uniquecheck;
    2. import lombok.Builder;
    3. import lombok.Data;
    4. /**
    5. * 唯一校验明细信息
    6. *
    7. * @author xudongmaster
    8. */
    9. @Data
    10. @Builder
    11. public class UniqueCheckDetail {
    12. /**
    13. * 字段中文名
    14. */
    15. private String fileCnName;
    16. /**
    17. * 提示
    18. */
    19. private String tip;
    20. }

    2.3 UniqueCheckArgs

    1. package com.xudongbase.uniquecheck.args;
    2. /**
    3. * 唯一校验参数类
    4. *
    5. * @author xudongmaster
    6. */
    7. public interface UniqueCheckArgs {
    8. }

    2.4 UniqueCheckService 

    1. package com.xudongbase.uniquecheck;
    2. import com.xudongbase.uniquecheck.args.UniqueCheckArgs;
    3. import java.util.List;
    4. /**
    5. * 唯一校验类
    6. *
    7. * @author xudongmaster
    8. */
    9. public interface UniqueCheckService {
    10. /**
    11. * 唯一校验
    12. *
    13. * @param args
    14. * @return
    15. */
    16. List uniqueCheck(UniqueCheckArgs args);
    17. }

    2.5 AbstractUniqueCheckService

    1. package com.xudongbase.uniquecheck;
    2. import cn.hutool.core.collection.CollUtil;
    3. import com.google.common.collect.Lists;
    4. import com.xudongbase.uniquecheck.annotation.UniqueCheck;
    5. import com.xudongbase.uniquecheck.args.UniqueCheckArgs;
    6. import org.apache.commons.lang3.reflect.FieldUtils;
    7. import java.lang.reflect.Field;
    8. import java.util.List;
    9. /**
    10. * 抽象唯一校验类
    11. *
    12. * @author xudongmaster
    13. */
    14. public abstract class AbstractUniqueCheckService implements UniqueCheckService {
    15. /**
    16. * 唯一校验
    17. *
    18. * @param args
    19. * @return
    20. */
    21. @Override
    22. public List uniqueCheck(UniqueCheckArgs args) {
    23. //获取用来校验的数据
    24. List dataList = getCheckData(args);
    25. //进行唯一校验
    26. return implementsUniqueCheck(dataList, args);
    27. }
    28. /**
    29. * 获取用来校验的数据
    30. *
    31. * @param args 传参
    32. * @return
    33. */
    34. abstract List getCheckData(UniqueCheckArgs args);
    35. /**
    36. * 需要实现的唯一校验
    37. *
    38. * @param dataList 用来校验的数据
    39. * @param args 传参
    40. * @return
    41. */
    42. abstract List implementsUniqueCheck(List dataList, UniqueCheckArgs args);
    43. /**
    44. * 通用唯一校验方法
    45. *
    46. * @param dataList 用来校验的数据
    47. * @param needUniqueTarget 需要校验的对象
    48. * @return
    49. */
    50. public static List commonUniqueCheck(List dataList, T needUniqueTarget) {
    51. List uniqueCheckDetailList = Lists.newLinkedList();
    52. if (CollUtil.isEmpty(dataList) || needUniqueTarget == null) {
    53. return uniqueCheckDetailList;
    54. }
    55. Class clazz = needUniqueTarget.getClass();
    56. //获取需要进行唯一校验的字段
    57. List fieldList = FieldUtils.getFieldsListWithAnnotation(clazz, UniqueCheck.class);
    58. if (CollUtil.isEmpty(fieldList)) {
    59. return uniqueCheckDetailList;
    60. }
    61. List checkFieldValueList;
    62. Object needUniqueFieldValue;
    63. Object checkFieldValue;
    64. UniqueCheckDetail uniqueCheckDetail;
    65. UniqueCheck uniqueCheck;
    66. for (Field field : fieldList) {
    67. field.setAccessible(true);
    68. checkFieldValueList = Lists.newLinkedList();
    69. needUniqueFieldValue = null;
    70. //获取需要校验的字段值
    71. try {
    72. needUniqueFieldValue = field.get(needUniqueTarget);
    73. } catch (Exception e) {
    74. }
    75. if (needUniqueFieldValue == null) {
    76. continue;
    77. }
    78. Object filterNeedUniqueFieldValue = needUniqueFieldValue;
    79. //获取用来校验的对象的字段值
    80. for (T data : dataList) {
    81. checkFieldValue = null;
    82. try {
    83. checkFieldValue = field.get(data);
    84. } catch (Exception e) {
    85. }
    86. if (checkFieldValue == null) {
    87. continue;
    88. }
    89. checkFieldValueList.add(checkFieldValue);
    90. }
    91. if (CollUtil.isEmpty(checkFieldValueList)) {
    92. continue;
    93. }
    94. //存在重复的字段值
    95. if (checkFieldValueList.stream().filter(x -> x.equals(filterNeedUniqueFieldValue)).count() > 0) {
    96. uniqueCheck = field.getAnnotation(UniqueCheck.class);
    97. uniqueCheckDetail = UniqueCheckDetail.builder()
    98. .fileCnName(uniqueCheck.cnName())
    99. .tip(uniqueCheck.cnName() + uniqueCheck.tip()).build();
    100. uniqueCheckDetailList.add(uniqueCheckDetail);
    101. }
    102. }
    103. return uniqueCheckDetailList;
    104. }
    105. }
    106. 3 调试代码

      3.1 UserCheckArgs 

      1. package com.xudongbase.uniquecheck.args;
      2. import com.xudongbase.uniquecheck.vo.UserUniqueCheckVo;
      3. import lombok.Data;
      4. /**
      5. * 用户唯一校验参数类
      6. *
      7. * @author xudongmaster
      8. */
      9. @Data
      10. public class UserCheckArgs implements UniqueCheckArgs {
      11. /**
      12. * 需要进行唯一校验的用户信息
      13. */
      14. private UserUniqueCheckVo needUniqueTarget;
      15. }

      3.2 UserUniqueCheckVo 

      1. package com.xudongbase.uniquecheck.vo;
      2. import com.xudongbase.uniquecheck.annotation.UniqueCheck;
      3. import lombok.Data;
      4. /**
      5. * 用户唯一校验vo
      6. *
      7. * @author xudongmaster
      8. */
      9. @Data
      10. public class UserUniqueCheckVo {
      11. @UniqueCheck(cnName = "用户id")
      12. private Long id;
      13. /**
      14. * 用户名
      15. */
      16. @UniqueCheck(cnName = "用户名")
      17. private String username;
      18. }

      3.3 UserUniqueCheckService 

      1. package com.xudongbase.uniquecheck;
      2. import com.google.common.collect.Lists;
      3. import com.xudongbase.uniquecheck.args.UniqueCheckArgs;
      4. import com.xudongbase.uniquecheck.args.UserCheckArgs;
      5. import com.xudongbase.uniquecheck.vo.UserUniqueCheckVo;
      6. import org.springframework.stereotype.Service;
      7. import java.util.List;
      8. /**
      9. * 用户唯一校验类
      10. *
      11. * @author xudongmaster
      12. */
      13. @Service("UserUniqueCheckService")
      14. public class UserUniqueCheckService extends AbstractUniqueCheckService {
      15. /**
      16. * 获取用来校验的数据
      17. *
      18. * @param args 传参
      19. * @return
      20. */
      21. @Override
      22. List getCheckData(UniqueCheckArgs args) {
      23. List userUniqueCheckVoList=Lists.newLinkedList();
      24. UserUniqueCheckVo userUniqueCheckVo=new UserUniqueCheckVo();
      25. userUniqueCheckVo.setId(1L);
      26. userUniqueCheckVo.setUsername("xudongmaster");
      27. userUniqueCheckVoList.add(userUniqueCheckVo);
      28. return userUniqueCheckVoList;
      29. }
      30. /**
      31. * 需要实现的唯一校验
      32. *
      33. * @param dataList 用来校验的数据
      34. * @param args 传参
      35. * @return
      36. */
      37. @Override
      38. List implementsUniqueCheck(List dataList, UniqueCheckArgs args) {
      39. UserCheckArgs userCheckArgs = (UserCheckArgs) args;
      40. UserUniqueCheckVo needUniqueTarget = userCheckArgs.getNeedUniqueTarget();
      41. return commonUniqueCheck(dataList, needUniqueTarget);
      42. }
      43. }

      3.4 UniqueCheckEnum 

      1. package com.xudongbase.uniquecheck.enums;
      2. import lombok.AllArgsConstructor;
      3. import lombok.Getter;
      4. /**
      5. * 唯一校验实例枚举类
      6. *
      7. * @author Xudongmaster
      8. */
      9. @Getter
      10. @AllArgsConstructor
      11. public enum UniqueCheckEnum {
      12. USER("UserUniqueCheckService", "用户唯一校验");
      13. private final String value;
      14. private final String name;
      15. }

      3.5 单元测试代码

      1. package com.xudongbase.uniquecheck;
      2. import com.alibaba.fastjson.JSONObject;
      3. import com.google.gson.JsonObject;
      4. import com.xudongbase.uniquecheck.args.UserCheckArgs;
      5. import com.xudongbase.uniquecheck.enums.UniqueCheckEnum;
      6. import com.xudongbase.uniquecheck.vo.UserUniqueCheckVo;
      7. import lombok.extern.slf4j.Slf4j;
      8. import org.junit.jupiter.api.Test;
      9. import org.springframework.beans.factory.annotation.Autowired;
      10. import org.springframework.boot.test.context.SpringBootTest;
      11. import java.util.List;
      12. import java.util.Map;
      13. @SpringBootTest
      14. @Slf4j
      15. public class UniqueCheckTest {
      16. @Autowired
      17. private Map uniqueCheckServiceMap;
      18. /**
      19. * 测试用户唯一校验
      20. */
      21. @Test
      22. public void testUserUniqueCheck() {
      23. UserCheckArgs userCheckArgs = new UserCheckArgs();
      24. UserUniqueCheckVo userUniqueCheckVo = new UserUniqueCheckVo();
      25. userUniqueCheckVo.setId(2L);
      26. userUniqueCheckVo.setUsername("xudongmaster");
      27. userCheckArgs.setNeedUniqueTarget(userUniqueCheckVo);
      28. List uniqueCheckDetailList = uniqueCheckServiceMap.get(UniqueCheckEnum.USER.getValue()).uniqueCheck(userCheckArgs);
      29. log.info(JSONObject.toJSONString(uniqueCheckDetailList));
      30. }
      31. }

      4 调试结果

       注:

      觉得这篇博客写的不错的可以前往Gitee/GitCode点个Star,源码请查看Gitee/GitCode的xudongbase项目unique_check分支。 

      文件 · unique_check · 旭东怪 / Xudongbase · GitCode主要是项目中可以用到的共通方法,现有easyexcel分支在持续更新中。 欢迎大家Star和提交Issues。 easyexcel分支:批量设置样式,批量添加批注,批量合并单元格,设置冻结行和列,设置行高列宽,隐藏行和列,绑定下拉框数据,设置水印,插入图片https://gitcode.net/qq_38974638/xudongbase/-/tree/unique_checkxudongbase: 主要是项目中可以用到的共通方法,现有easyexcel分支在持续更新中。欢迎大家Star和提交Issues。easyexcel分支:批量设置样式,批量添加批注,批量合并单元格,设置冻结行和列,设置行高列宽,隐藏行和列,绑定下拉框数据,设置水印,插入图片 - Gitee.comhttps://gitee.com/xudong_master/xudongbase/tree/unique_check

    107. 相关阅读:
      工业智能网关BL110应用之七十六: 实现西门子S7-400 PLC接入Modbus TCP Server云平台
      Word处理控件Aspose.Words功能演示:使用 Python 创建 MS Word 文档
      ffmpeg filter amix混音实现
      python之获取文件os模块
      Linux项目自动化构建工具-make/Makefile
      Swagger学习
      数据分析与可视化 Numpy数组
      基于贝塞尔曲线(Bézier Curve)与硬约束的轨迹优化方法
      nodejs+vue备忘记账系统-计算机毕业设计
      java计算机毕业设计游戏账号交易源程序+mysql+系统+lw文档+远程调试
    108. 原文地址:https://blog.csdn.net/qq_38974638/article/details/126336186
      • 最新文章
      • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
        用 Hashids 优雅解决 C 端自增 ID 暴露问题
        V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
        LLVM Pass快速入门(四):代码插桩
        milkup:桌面端 markdown AI续写和即时渲染
        基于项目工程构建SBOM(软件物料清单)的研究
        鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
        .NET 中如何快速实现 List 集合去重?
        扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
        浅谈数据访问层
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      小工具 小游戏
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

      京公网安备 11010502049817号