Spring?Boot?實(shí)現(xiàn)字段唯一校驗(yàn)功能(實(shí)例代碼)
1 Maven依賴
<!-- apache 工具包 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.9</version> </dependency>
2 實(shí)現(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; /** * 在指定的字段用此注解 * 用來(lái)唯一校驗(yàn) * * @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; /** * 唯一校驗(yàn)明細(xì)信息 * * @author xudongmaster */ @Data @Builder public class UniqueCheckDetail { /** * 字段中文名 */ private String fileCnName; /** * 提示 */ private String tip; }
2.3 UniqueCheckArgs
package com.xudongbase.uniquecheck.args; /** * 唯一校驗(yàn)參數(shù)類 * * @author xudongmaster */ public interface UniqueCheckArgs { }
2.4 UniqueCheckService
package com.xudongbase.uniquecheck; import com.xudongbase.uniquecheck.args.UniqueCheckArgs; import java.util.List; /** * 唯一校驗(yàn)類 * * @author xudongmaster */ public interface UniqueCheckService { /** * 唯一校驗(yàn) * * @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; /** * 抽象唯一校驗(yàn)類 * * @author xudongmaster */ public abstract class AbstractUniqueCheckService<T> implements UniqueCheckService { /** * 唯一校驗(yàn) * * @param args * @return */ @Override public List<UniqueCheckDetail> uniqueCheck(UniqueCheckArgs args) { //獲取用來(lái)校驗(yàn)的數(shù)據(jù) List<T> dataList = getCheckData(args); //進(jìn)行唯一校驗(yàn) return implementsUniqueCheck(dataList, args); } /** * 獲取用來(lái)校驗(yàn)的數(shù)據(jù) * * @param args 傳參 * @return */ abstract List<T> getCheckData(UniqueCheckArgs args); /** * 需要實(shí)現(xiàn)的唯一校驗(yàn) * * @param dataList 用來(lái)校驗(yàn)的數(shù)據(jù) * @param args 傳參 * @return */ abstract List<UniqueCheckDetail> implementsUniqueCheck(List<T> dataList, UniqueCheckArgs args); /** * 通用唯一校驗(yàn)方法 * * @param dataList 用來(lái)校驗(yàn)的數(shù)據(jù) * @param needUniqueTarget 需要校驗(yàn)的對(duì)象 * @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(); //獲取需要進(jìn)行唯一校驗(yàn)的字段 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; //獲取需要校驗(yàn)的字段值 try { needUniqueFieldValue = field.get(needUniqueTarget); } catch (Exception e) { } if (needUniqueFieldValue == null) { continue; } Object filterNeedUniqueFieldValue = needUniqueFieldValue; //獲取用來(lái)校驗(yàn)的對(duì)象的字段值 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; /** * 用戶唯一校驗(yàn)參數(shù)類 * * @author xudongmaster */ @Data public class UserCheckArgs implements UniqueCheckArgs { /** * 需要進(jìn)行唯一校驗(yàn)的用戶信息 */ private UserUniqueCheckVo needUniqueTarget; }
3.2 UserUniqueCheckVo
package com.xudongbase.uniquecheck.vo; import com.xudongbase.uniquecheck.annotation.UniqueCheck; import lombok.Data; /** * 用戶唯一校驗(yàn)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; /** * 用戶唯一校驗(yàn)類 * * @author xudongmaster */ @Service("UserUniqueCheckService") public class UserUniqueCheckService extends AbstractUniqueCheckService<UserUniqueCheckVo> { /** * 獲取用來(lái)校驗(yàn)的數(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; } /** * 需要實(shí)現(xiàn)的唯一校驗(yàn) * * @param dataList 用來(lái)校驗(yàn)的數(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; /** * 唯一校驗(yàn)實(shí)例枚舉類 * * @author Xudongmaster */ @Getter @AllArgsConstructor public enum UniqueCheckEnum { USER("UserUniqueCheckService", "用戶唯一校驗(yàn)"); private final String value; private final String name; }
3.5 單元測(cè)試代碼
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; /** * 測(cè)試用戶唯一校驗(yàn) */ @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é)果
注:
覺(jué)得這篇博客寫的不錯(cuò)的可以前往Gitee/GitCode點(diǎn)個(gè)Star,源碼請(qǐng)查看Gitee/GitCode的xudongbase項(xiàng)目unique_check分支。
到此這篇關(guān)于Spring Boot 實(shí)現(xiàn)字段唯一校驗(yàn)的文章就介紹到這了,更多相關(guān)Spring Boot 字段唯一校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
簡(jiǎn)單了解Java關(guān)鍵字throw和throws的區(qū)別
這篇文章主要介紹了簡(jiǎn)單了解Java關(guān)鍵字throw和throws的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11Java 實(shí)戰(zhàn)項(xiàng)目之倉(cāng)庫(kù)管理系統(tǒng)的實(shí)現(xiàn)流程
讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)倉(cāng)庫(kù)管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11Java實(shí)現(xiàn)的mysql事務(wù)處理操作示例
這篇文章主要介紹了Java實(shí)現(xiàn)的mysql事務(wù)處理操作,結(jié)合實(shí)例形式較為詳細(xì)的分析了Java基于JDBC操作mysql數(shù)據(jù)庫(kù)實(shí)現(xiàn)事務(wù)處理的相關(guān)概念、操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-08-08Java更新調(diào)度器(update scheduler)的使用詳解
Java更新調(diào)度器是Java中的一個(gè)特性,可以自動(dòng)化Java應(yīng)用程序的更新過(guò)程,它提供了一種方便的方式來(lái)安排Java應(yīng)用程序的更新,確保其與最新的功能、錯(cuò)誤修復(fù)和安全補(bǔ)丁保持同步,本文將深入介紹如何使用Java更新調(diào)度器,并解釋它對(duì)Java開(kāi)發(fā)人員和用戶的好處2023-11-11