Spring?Boot?實現(xiàn)字段唯一校驗功能(實例代碼)
1 Maven依賴
<!-- apache 工具包 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.9</version> </dependency>
2 實現(xiàn)代碼
2.1 UniqueCheck
package com.xudongbase.uniquecheck.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 在指定的字段用此注解 * 用來唯一校驗 * * @author xudongmaster */ @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface UniqueCheck { /** * 字段的中文名 * * @return */ String cnName(); /** * 提示 * * @return */ String tip() default "存在重復(fù)"; }
2.2 UniqueCheckDetail
package com.xudongbase.uniquecheck; import lombok.Builder; import lombok.Data; /** * 唯一校驗明細(xì)信息 * * @author xudongmaster */ @Data @Builder public class UniqueCheckDetail { /** * 字段中文名 */ private String fileCnName; /** * 提示 */ private String tip; }
2.3 UniqueCheckArgs
package com.xudongbase.uniquecheck.args; /** * 唯一校驗參數(shù)類 * * @author xudongmaster */ public interface UniqueCheckArgs { }
2.4 UniqueCheckService
package com.xudongbase.uniquecheck; import com.xudongbase.uniquecheck.args.UniqueCheckArgs; import java.util.List; /** * 唯一校驗類 * * @author xudongmaster */ public interface UniqueCheckService { /** * 唯一校驗 * * @param args * @return */ List<UniqueCheckDetail> uniqueCheck(UniqueCheckArgs args); }
2.5 AbstractUniqueCheckService
package com.xudongbase.uniquecheck; import cn.hutool.core.collection.CollUtil; import com.google.common.collect.Lists; import com.xudongbase.uniquecheck.annotation.UniqueCheck; import com.xudongbase.uniquecheck.args.UniqueCheckArgs; import org.apache.commons.lang3.reflect.FieldUtils; import java.lang.reflect.Field; import java.util.List; /** * 抽象唯一校驗類 * * @author xudongmaster */ public abstract class AbstractUniqueCheckService<T> implements UniqueCheckService { /** * 唯一校驗 * * @param args * @return */ @Override public List<UniqueCheckDetail> uniqueCheck(UniqueCheckArgs args) { //獲取用來校驗的數(shù)據(jù) List<T> dataList = getCheckData(args); //進行唯一校驗 return implementsUniqueCheck(dataList, args); } /** * 獲取用來校驗的數(shù)據(jù) * * @param args 傳參 * @return */ abstract List<T> getCheckData(UniqueCheckArgs args); /** * 需要實現(xiàn)的唯一校驗 * * @param dataList 用來校驗的數(shù)據(jù) * @param args 傳參 * @return */ abstract List<UniqueCheckDetail> implementsUniqueCheck(List<T> dataList, UniqueCheckArgs args); /** * 通用唯一校驗方法 * * @param dataList 用來校驗的數(shù)據(jù) * @param needUniqueTarget 需要校驗的對象 * @return */ public static <T> List<UniqueCheckDetail> commonUniqueCheck(List<T> dataList, T needUniqueTarget) { List<UniqueCheckDetail> uniqueCheckDetailList = Lists.newLinkedList(); if (CollUtil.isEmpty(dataList) || needUniqueTarget == null) { return uniqueCheckDetailList; } Class<?> clazz = needUniqueTarget.getClass(); //獲取需要進行唯一校驗的字段 List<Field> fieldList = FieldUtils.getFieldsListWithAnnotation(clazz, UniqueCheck.class); if (CollUtil.isEmpty(fieldList)) { return uniqueCheckDetailList; } List<Object> checkFieldValueList; Object needUniqueFieldValue; Object checkFieldValue; UniqueCheckDetail uniqueCheckDetail; UniqueCheck uniqueCheck; for (Field field : fieldList) { field.setAccessible(true); checkFieldValueList = Lists.newLinkedList(); needUniqueFieldValue = null; //獲取需要校驗的字段值 try { needUniqueFieldValue = field.get(needUniqueTarget); } catch (Exception e) { } if (needUniqueFieldValue == null) { continue; } Object filterNeedUniqueFieldValue = needUniqueFieldValue; //獲取用來校驗的對象的字段值 for (T data : dataList) { checkFieldValue = null; try { checkFieldValue = field.get(data); } catch (Exception e) { } if (checkFieldValue == null) { continue; } checkFieldValueList.add(checkFieldValue); } if (CollUtil.isEmpty(checkFieldValueList)) { continue; } //存在重復(fù)的字段值 if (checkFieldValueList.stream().filter(x -> x.equals(filterNeedUniqueFieldValue)).count() > 0) { uniqueCheck = field.getAnnotation(UniqueCheck.class); uniqueCheckDetail = UniqueCheckDetail.builder() .fileCnName(uniqueCheck.cnName()) .tip(uniqueCheck.cnName() + uniqueCheck.tip()).build(); uniqueCheckDetailList.add(uniqueCheckDetail); } } return uniqueCheckDetailList; } }
3 調(diào)試代碼
3.1 UserCheckArgs
package com.xudongbase.uniquecheck.args; import com.xudongbase.uniquecheck.vo.UserUniqueCheckVo; import lombok.Data; /** * 用戶唯一校驗參數(shù)類 * * @author xudongmaster */ @Data public class UserCheckArgs implements UniqueCheckArgs { /** * 需要進行唯一校驗的用戶信息 */ private UserUniqueCheckVo needUniqueTarget; }
3.2 UserUniqueCheckVo
package com.xudongbase.uniquecheck.vo; import com.xudongbase.uniquecheck.annotation.UniqueCheck; import lombok.Data; /** * 用戶唯一校驗vo * * @author xudongmaster */ @Data public class UserUniqueCheckVo { @UniqueCheck(cnName = "用戶id") private Long id; /** * 用戶名 */ @UniqueCheck(cnName = "用戶名") private String username; }
3.3 UserUniqueCheckService
package com.xudongbase.uniquecheck; import com.google.common.collect.Lists; import com.xudongbase.uniquecheck.args.UniqueCheckArgs; import com.xudongbase.uniquecheck.args.UserCheckArgs; import com.xudongbase.uniquecheck.vo.UserUniqueCheckVo; import org.springframework.stereotype.Service; import java.util.List; /** * 用戶唯一校驗類 * * @author xudongmaster */ @Service("UserUniqueCheckService") public class UserUniqueCheckService extends AbstractUniqueCheckService<UserUniqueCheckVo> { /** * 獲取用來校驗的數(shù)據(jù) * * @param args 傳參 * @return */ @Override List<UserUniqueCheckVo> getCheckData(UniqueCheckArgs args) { List<UserUniqueCheckVo> userUniqueCheckVoList=Lists.newLinkedList(); UserUniqueCheckVo userUniqueCheckVo=new UserUniqueCheckVo(); userUniqueCheckVo.setId(1L); userUniqueCheckVo.setUsername("xudongmaster"); userUniqueCheckVoList.add(userUniqueCheckVo); return userUniqueCheckVoList; } /** * 需要實現(xiàn)的唯一校驗 * * @param dataList 用來校驗的數(shù)據(jù) * @param args 傳參 * @return */ @Override List<UniqueCheckDetail> implementsUniqueCheck(List dataList, UniqueCheckArgs args) { UserCheckArgs userCheckArgs = (UserCheckArgs) args; UserUniqueCheckVo needUniqueTarget = userCheckArgs.getNeedUniqueTarget(); return commonUniqueCheck(dataList, needUniqueTarget); } }
3.4 UniqueCheckEnum
package com.xudongbase.uniquecheck.enums; import lombok.AllArgsConstructor; import lombok.Getter; /** * 唯一校驗實例枚舉類 * * @author Xudongmaster */ @Getter @AllArgsConstructor public enum UniqueCheckEnum { USER("UserUniqueCheckService", "用戶唯一校驗"); private final String value; private final String name; }
3.5 單元測試代碼
package com.xudongbase.uniquecheck; import com.alibaba.fastjson.JSONObject; import com.google.gson.JsonObject; import com.xudongbase.uniquecheck.args.UserCheckArgs; import com.xudongbase.uniquecheck.enums.UniqueCheckEnum; import com.xudongbase.uniquecheck.vo.UserUniqueCheckVo; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; import java.util.Map; @SpringBootTest @Slf4j public class UniqueCheckTest { @Autowired private Map<String, UniqueCheckService> uniqueCheckServiceMap; /** * 測試用戶唯一校驗 */ @Test public void testUserUniqueCheck() { UserCheckArgs userCheckArgs = new UserCheckArgs(); UserUniqueCheckVo userUniqueCheckVo = new UserUniqueCheckVo(); userUniqueCheckVo.setId(2L); userUniqueCheckVo.setUsername("xudongmaster"); userCheckArgs.setNeedUniqueTarget(userUniqueCheckVo); List<UniqueCheckDetail> uniqueCheckDetailList = uniqueCheckServiceMap.get(UniqueCheckEnum.USER.getValue()).uniqueCheck(userCheckArgs); log.info(JSONObject.toJSONString(uniqueCheckDetailList)); } }
4 調(diào)試結(jié)果
注:
覺得這篇博客寫的不錯的可以前往Gitee/GitCode點個Star,源碼請查看Gitee/GitCode的xudongbase項目unique_check分支。
到此這篇關(guān)于Spring Boot 實現(xiàn)字段唯一校驗的文章就介紹到這了,更多相關(guān)Spring Boot 字段唯一校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
簡單了解Java關(guān)鍵字throw和throws的區(qū)別
這篇文章主要介紹了簡單了解Java關(guān)鍵字throw和throws的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11Java 實戰(zhàn)項目之倉庫管理系統(tǒng)的實現(xiàn)流程
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實現(xiàn)一個倉庫管理系統(tǒng),大家可以在過程中查缺補漏,提升水平2021-11-11Java實現(xiàn)的mysql事務(wù)處理操作示例
這篇文章主要介紹了Java實現(xiàn)的mysql事務(wù)處理操作,結(jié)合實例形式較為詳細(xì)的分析了Java基于JDBC操作mysql數(shù)據(jù)庫實現(xiàn)事務(wù)處理的相關(guān)概念、操作技巧與注意事項,需要的朋友可以參考下2018-08-08Java更新調(diào)度器(update scheduler)的使用詳解
Java更新調(diào)度器是Java中的一個特性,可以自動化Java應(yīng)用程序的更新過程,它提供了一種方便的方式來安排Java應(yīng)用程序的更新,確保其與最新的功能、錯誤修復(fù)和安全補丁保持同步,本文將深入介紹如何使用Java更新調(diào)度器,并解釋它對Java開發(fā)人員和用戶的好處2023-11-11