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;
/**
* 在指定的字段用此注解
* 用來唯一校驗(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) {
//獲取用來校驗(yàn)的數(shù)據(jù)
List<T> dataList = getCheckData(args);
//進(jìn)行唯一校驗(yàn)
return implementsUniqueCheck(dataList, args);
}
/**
* 獲取用來校驗(yàn)的數(shù)據(jù)
*
* @param args 傳參
* @return
*/
abstract List<T> getCheckData(UniqueCheckArgs args);
/**
* 需要實(shí)現(xiàn)的唯一校驗(yàn)
*
* @param dataList 用來校驗(yàn)的數(shù)據(jù)
* @param args 傳參
* @return
*/
abstract List<UniqueCheckDetail> implementsUniqueCheck(List<T> dataList, UniqueCheckArgs args);
/**
* 通用唯一校驗(yàn)方法
*
* @param dataList 用來校驗(yàn)的數(shù)據(jù)
* @param needUniqueTarget 需要校驗(yàn)的對象
* @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;
//獲取用來校驗(yàn)的對象的字段值
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> {
/**
* 獲取用來校驗(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 用來校驗(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 單元測試代碼
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;
/**
* 測試用戶唯一校驗(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é)果

注:
覺得這篇博客寫的不錯(cuò)的可以前往Gitee/GitCode點(diǎn)個(gè)Star,源碼請查看Gitee/GitCode的xudongbase項(xiàng)目unique_check分支。
到此這篇關(guān)于Spring Boot 實(shí)現(xiàn)字段唯一校驗(yàn)的文章就介紹到這了,更多相關(guān)Spring Boot 字段唯一校驗(yàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyEclipse2017創(chuàng)建Spring項(xiàng)目的方法
這篇文章主要為大家詳細(xì)介紹了MyEclipse2017創(chuàng)建Spring項(xiàng)目的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
Springboot工具類FileCopyUtils使用教程
這篇文章主要介紹了Springboot內(nèi)置的工具類之FileCopyUtils的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12
Java Socket編程(四) 重復(fù)和并發(fā)服務(wù)器
Java Socket編程(四) 重復(fù)和并發(fā)服務(wù)器...2006-12-12
Java實(shí)現(xiàn)的Excel列號(hào)數(shù)字與字母互相轉(zhuǎn)換功能
這篇文章主要介紹了Java實(shí)現(xiàn)的Excel列號(hào)數(shù)字與字母互相轉(zhuǎn)換功能,涉及java針對Excel相關(guān)數(shù)值與字符串操作技巧,需要的朋友可以參考下2018-03-03
Java使用XML與注解方式實(shí)現(xiàn)CRUD操作代碼
MyBatis提供了靈活的配置和使用方式,使得數(shù)據(jù)庫操作更加簡潔和高效,通過本文,我們介紹了如何使用MyBatis框架,通過XML映射文件和注解兩種方式來實(shí)現(xiàn)數(shù)據(jù)庫的增刪改查操作,感興趣的朋友跟隨小編一起看看吧2024-02-02
Springcloud服務(wù)注冊consul客戶端過程解析
這篇文章主要介紹了Springcloud服務(wù)注冊consul客戶端過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
解讀HttpServletRequestWrapper處理request數(shù)據(jù)流多次讀取問題
在Java Web開發(fā)中,獲取HTTP請求參數(shù)是常見需求,本文詳細(xì)討論了通過POST方式獲取參數(shù)的兩種主要方法:使用request.getParameter()適用于application/x-www-form-urlencoded和multipart/form-data內(nèi)容類型;而對于application/json類型的數(shù)據(jù)2024-10-10
JAVA的LIST接口的REMOVE重載方法調(diào)用原理解析
這篇文章主要介紹了JAVA的LIST接口的REMOVE重載方法調(diào)用原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10

