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;
/**
* 唯一校驗明細信息
*
* @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ū)別,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11
Java 實戰(zhàn)項目之倉庫管理系統(tǒng)的實現(xiàn)流程
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實現(xiàn)一個倉庫管理系統(tǒng),大家可以在過程中查缺補漏,提升水平2021-11-11
Java實現(xiàn)的mysql事務(wù)處理操作示例
這篇文章主要介紹了Java實現(xiàn)的mysql事務(wù)處理操作,結(jié)合實例形式較為詳細的分析了Java基于JDBC操作mysql數(shù)據(jù)庫實現(xiàn)事務(wù)處理的相關(guān)概念、操作技巧與注意事項,需要的朋友可以參考下2018-08-08
Java更新調(diào)度器(update scheduler)的使用詳解
Java更新調(diào)度器是Java中的一個特性,可以自動化Java應(yīng)用程序的更新過程,它提供了一種方便的方式來安排Java應(yīng)用程序的更新,確保其與最新的功能、錯誤修復(fù)和安全補丁保持同步,本文將深入介紹如何使用Java更新調(diào)度器,并解釋它對Java開發(fā)人員和用戶的好處2023-11-11

