码农知识堂 - 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. 相关阅读:
      智慧风电 | 图扑软件数字孪生风机设备,3D 可视化智能运维
      Go学习笔记 -- fmt常用打印方法及占位符介绍
      数据库实践 Hw05
      2023最新SSM计算机毕业设计选题大全(附源码+LW)之java宠物寄养平台设计03zp5
      HTML做一个简单漂亮的旅游网页(纯html代码)重庆旅游 7页
      Apache解析漏洞实验
      【学习总结】Python transformers AutoTokenizer encode 出现的 101 和 102
      微软宣布 S2C2F 已被 OpenSSF 采用
      Django报错:RuntimeError at /home/ 解决办法
      腾讯云轻量数据库是什么?轻量数据库测评详细介绍
    108. 原文地址:https://blog.csdn.net/qq_38974638/article/details/126336186
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | Kerberos协议及其部分攻击手法
        0day的产生 | 不懂代码的"代码审计"
        安装scrcpy-client模块av模块异常,环境问题解决方案
        leetcode hot100【LeetCode 279. 完全平方数】java实现
        OpenWrt下安装Mosquitto
        AnatoMask论文汇总
        【AI日记】24.11.01 LangChain、openai api和github copilot
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
      正则表达式工具 cron表达式工具 密码生成工具

      京公网安备 11010502049817号