java開發(fā)validate方法中校驗工具類詳解

validate方法中校驗工具類
日常Java開發(fā)中,我們使用validate的校驗是很方便的,但是也有一些特殊情況需要單獨處理,
例如:導(dǎo)入Excel校驗,傳入的是MultipartFile文件類型,我們不能使用注解進行校驗實體信息,只能通過先解析成實體類然后進行校驗,此時已經(jīng)到了方法里面,不能使用校驗注解來處理了,我們應(yīng)該如何處理這類情況呢?
一般情況下,我們校驗用的@Validated或者@Valid注解是直接在controller中添加,
然后全局異常處理 @RestControllerAdvice 中 進行攔截處理并返回所需校驗提示信息。
但是,如果在方法Service中如何使用validate方法校驗?zāi)?,加注解是不能生效的,因為源碼沒有直接這樣處理。
不過,我們可以使用源碼提供的ValidatorFactory工廠的Validator校驗器的validate方法。
import lombok.experimental.UtilityClass;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.validator.HibernateValidator;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.List;
import java.util.Set;
/**
* validate方法中校驗工具類
* <p>
* 只要在實體中加上相應(yīng)的validate的相關(guān)注解即可
* </p>
*
* @author Zed
*/
@UtilityClass
public class ValidateTools {
/**
* 初始化檢查器
*/
private static final ValidatorFactory VALIDATOR_FACTORY = Validation.byProvider(HibernateValidator.class).configure().failFast(false).buildValidatorFactory();
private static final Validator VALIDATOR = VALIDATOR_FACTORY.getValidator();
/**
* 校驗返回異常信息
*
* @param t 實體
* @param <T> 實體泛型
*/
public static <T> String validStr(T t) {
// 構(gòu)造返回信息
StringBuilder validMessage = new StringBuilder();
// 檢查實體T
Set<ConstraintViolation<T>> set = VALIDATOR.validate(t);
// 循環(huán)set,獲取檢查結(jié)果
for (ConstraintViolation<T> vo : set) {
validMessage.append(vo.getMessage()).append(";");
}
return validMessage.toString();
}
/**
* 校驗實體拋出異常
*
* @param t 實體
* @param <T> 實體泛型
*/
public static <T> void valid(T t) {
String validStr = validStr(t);
// 拋出業(yè)務(wù)異常
if (StringUtils.isNotBlank(validStr)) {
throw new BusinessException(validStr);
}
}
/**
* 校驗集合拋出異常
*
* @param list 列表
* @param <T> 實體泛型
*/
public static <T> void valid(List<T> list) {
if (CollectionUtils.isEmpty(list)) {
throw new BusinessException("數(shù)據(jù)不存在!");
}
// 構(gòu)造返回信息
StringBuilder validMessageTotal = new StringBuilder();
// 遍歷
for (int i = 0; i < list.size(); i++) {
String validStr = validStr(list.get(i));
if (StringUtils.isNotBlank(validStr)) {
String msg = String.format("第%d條數(shù)據(jù)校驗結(jié)果:[%s]\n", i + 1, validStr);
validMessageTotal.append(msg);
}
}
// 拋出業(yè)務(wù)異常
if (StringUtils.isNotBlank(validMessageTotal.toString())) {
throw new BusinessException(validMessageTotal.toString());
}
}
}
BusinessException是自己定義的業(yè)務(wù)異常類,然后在全局異常處理中增加這個異常攔截就行了。
僅供參考,實際開發(fā)請仔細測試找出合適的解決辦法。
以上就是java開發(fā)validate方法中校驗工具類詳解的詳細內(nèi)容,更多關(guān)于java validate方法校驗的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
手寫redis@Cacheable注解?參數(shù)java對象作為key值詳解
這篇文章主要介紹了手寫redis@Cacheable注解?參數(shù)java對象作為key值詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
創(chuàng)建SpringBoot工程并集成Mybatis的方法
這篇文章主要介紹了創(chuàng)建SpringBoot工程并集成Mybatis,需要的朋友可以參考下2018-06-06
關(guān)于Java兩個浮點型數(shù)字加減乘除的問題
由于浮點數(shù)在計算機中是以二進制表示的,直接進行加減乘除運算會出現(xiàn)精度誤差,想要得到精確結(jié)果,應(yīng)使用BigDecimal類進行運算2024-10-10
解決spring boot網(wǎng)關(guān)gateway導(dǎo)致的坑,無法下載文件問題
這篇文章主要介紹了解決spring boot網(wǎng)關(guān)gateway導(dǎo)致的坑,無法下載文件的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
Java Socket編程實現(xiàn)簡單的問候服務(wù)
這篇文章主要為大家介紹了Java Socket編程實現(xiàn)簡單的問候服務(wù),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-01-01

