SpringBoot?@GroupSequenceProvider注解實現(xiàn)bean多屬性聯(lián)合校驗的示例代碼
參考資料
分組序列@GroupSequenceProvider、@GroupSequence控制數(shù)據(jù)校驗順序,解決多字段聯(lián)合邏輯校驗問題【享學(xué)Spring MVC】
Hibernate Validator提供了非標(biāo)準(zhǔn)的
@GroupSequenceProvider注解。針對當(dāng)前對象實例的狀態(tài),動態(tài)來決定加載那些校驗組進(jìn)入默認(rèn)校驗組。
需要借助Hibernate Validation提供給我們的DefaultGroupSequenceProvider接口來處理那些屬性在什么情況下進(jìn)入指定的分組。
一. 前期準(zhǔn)備
?自定義校驗數(shù)值不能為空的注解
@Documented
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {ValidateIntegerNotEmpty.StrictIntegerNotEmptyValidator.class})
@ReportAsSingleViolation
public @interface ValidateIntegerNotEmpty {
String msgArgs() default "";
String message() default "{1001E}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
class StrictIntegerNotEmptyValidator implements ConstraintValidator<ValidateIntegerNotEmpty, Integer> {
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
return !ObjectUtils.isEmpty(value);
}
}
}
二. 需求
- 1 當(dāng)審核狀態(tài)為2(人工初審拒絕)的時候,審核拒絕原因為必填項,并且范圍為1到4
- 當(dāng)審核狀態(tài)為2之外(審核中或者人工初審?fù)ㄟ^)的情況,審核拒絕原因為非必填項
?前臺
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<script type="text/javascript" th:src="@{/js/public/jquery-3.6.0.min.js}"></script>
<script type="text/javascript" th:src="@{/js/common/common.js}"></script>
<title>test7頁面</title>
</head>
<body>
<button id="btn">校驗數(shù)據(jù)</button>
<h1>我是test7的頁面</h1>
</body>
<script>
$("#btn").click(() => {
const param1 = {
// 人工初審拒絕
auditStatus: 2,
// 拒絕的原因
auditRejectReason: 5,
};
const url = `http://localhost:8080/test7/groupSequenceProvider`;
doAjax(url, param1, function(data) {
console.log(data);
});
});
</script>
</html>?待校驗的form1
import com.example.jmw.common.validation.ValidateIntegerNotEmpty;
import com.example.jmw.form.validation.ValidateTest7FormProvider;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
import org.hibernate.validator.group.GroupSequenceProvider;
@Data
// 通過該注解所對應(yīng)的自定義Provider來實現(xiàn)多屬性聯(lián)合校驗
@GroupSequenceProvider(ValidateTest7FormProvider.class)
public class Test7Form {
/**
* 1: 審核中
* 2: 人工初審拒絕
* 3: 人工初審?fù)ㄟ^
*/
@ValidateIntegerNotEmpty(msgArgs = "審核狀態(tài)類型")
@Range(min = 1, max = 3, message = "審核拒絕原因:參數(shù)傳遞錯誤")
private Integer auditStatus;
/**
* 1: 不符合準(zhǔn)入要求
* 2: 三方數(shù)據(jù)拒貸
* 3: 授信額度為0
* 4: 其他
*/
@ValidateIntegerNotEmpty(msgArgs = "審核拒絕原因", groups = auditGroup.class)
@Range(min = 1, max = 4, message = "審核拒絕原因:參數(shù)傳遞錯誤", groups = auditGroup.class)
private Integer auditRejectReason;
// 自定義分組
public interface auditGroup {
}
}
?校驗器
import com.example.jmw.form.Test7Form;
import org.hibernate.validator.spi.group.DefaultGroupSequenceProvider;
import org.springframework.util.ObjectUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class ValidateTest7FormProvider implements DefaultGroupSequenceProvider<Test7Form> {
@Override
public List<Class<?>> getValidationGroups(Test7Form test7Form) {
List<Class<?>> defaultGroupSequence = new ArrayList<>();
defaultGroupSequence.add(Test7Form.class);
if (ObjectUtils.isEmpty(test7Form)) {
return defaultGroupSequence;
}
// 獲取 人工初審 狀態(tài)
Integer auditStatus = Optional.ofNullable(test7Form.getAuditStatus()).orElse(0) ;
// 如果 人工初審?fù)ㄟ^的話,審核拒絕原因的auditGroup組就會起作用,就變?yōu)楸靥铐椖?否則為選填項目
if (auditStatus == 2) {
defaultGroupSequence.add(Test7Form.auditGroup.class);
}
return defaultGroupSequence;
}
}
?Controller層進(jìn)行校驗
@Controller
@RequestMapping("/test7")
public class Test7Controller {
@Resource
private LocalValidatorFactoryBean validator;
@GetMapping("/init")
public ModelAndView init() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("test7");
return modelAndView;
}
@PostMapping("/groupSequenceProvider")
@ResponseBody
public void groupSequenceProvider(@RequestBody Test7Form form) {
Set<ConstraintViolation<Test7Form>> validate = validator.validate(form);
for (ConstraintViolation<Test7Form> bean : validate) {
// 獲取當(dāng)前的校驗信息
String message = bean.getMessage();
System.out.println(message);
}
}
}
當(dāng)參數(shù)auditStatus為2(人工初審拒絕)時,auditRejectReason(審核拒絕原因)超出了1到4的范圍,因此顯示出校驗信息

當(dāng)參數(shù)auditStatus為2(人工初審拒絕)時,auditRejectReason(審核拒絕原因)為必填項,因此顯示出校驗信息

當(dāng)參數(shù)auditStatus為3(人工初審?fù)ㄟ^)時,auditRejectReason(審核拒絕原因)為非必填項,因此無校驗失敗信息

三. 需求
- 2 當(dāng)游客(1)訪問時,最多有2個權(quán)限
- 當(dāng)領(lǐng)導(dǎo)(2)訪問時,最多有4個權(quán)限
- 當(dāng)管理員(3)訪問時,最多有10個權(quán)限
?前臺
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<script type="text/javascript" th:src="@{/js/public/jquery-3.6.0.min.js}"></script>
<script type="text/javascript" th:src="@{/js/common/common.js}"></script>
<title>test7頁面</title>
</head>
<body>
<button id="btn">校驗數(shù)據(jù)</button>
<h1>我是test7的頁面</h1>
</body>
<script>
$("#btn").click(() => {
const param2 = {
// 領(lǐng)導(dǎo)(2)訪問
role: 2,
// 權(quán)限的數(shù)量為5
permissionList: [1, 1, 1, 1, 1],
};
const url = `http://localhost:8080/test7/groupSequenceProvider`;
doAjax(url, param2, function(data) {
console.log(data);
});
});
</script>
</html>
?待校驗的form2
import com.example.jmw.common.validation.ValidateIntegerNotEmpty;
import com.example.jmw.form.validation.ValidateTest7Form1Provider;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
import org.hibernate.validator.group.GroupSequenceProvider;
import javax.validation.constraints.Size;
import java.util.List;
@Data
// 通過該注解所對應(yīng)的自定義Provider來實現(xiàn)多屬性聯(lián)合校驗
@GroupSequenceProvider(ValidateTest7Form1Provider.class)
public class Test7Form1 {
/**
* 1: 訪客
* 2: 領(lǐng)導(dǎo)
* 3: 管理員
*/
@ValidateIntegerNotEmpty(msgArgs = "角色類型")
@Range(min = 1, max = 3, message = "錯誤原因:參數(shù)傳遞錯誤")
private Integer role;
@Size.List({
// 訪客1個權(quán)限
@Size(min = 1, max = 2, message = "訪客最多擁有2個權(quán)限", groups = GuestGroup.class),
// 領(lǐng)導(dǎo)4個權(quán)限
@Size(min = 1, max = 4, message = "領(lǐng)導(dǎo)最多擁有4個權(quán)限", groups = LeaderGroup.class),
// 管理員10個權(quán)限
@Size(min = 1, max = 10, message = "管理員最多擁有10個權(quán)限", groups = AdminGroup.class)
})
private List<Integer> permissionList;
// 游客分組
public interface GuestGroup {
}
// 領(lǐng)導(dǎo)分組
public interface LeaderGroup {
}
// 管理員分組
public interface AdminGroup {
}
}
?校驗器
import com.example.jmw.form.Test7Form1;
import org.hibernate.validator.spi.group.DefaultGroupSequenceProvider;
import org.springframework.util.ObjectUtils;
import java.util.*;
public class ValidateTest7Form1Provider implements DefaultGroupSequenceProvider<Test7Form1> {
/**
* 1: 訪客
* 2: 領(lǐng)導(dǎo)
* 3: 管理員
*/
private final static List<Integer> roleList = Arrays.asList(1, 2, 3);
@Override
public List<Class<?>> getValidationGroups(Test7Form1 test7Form1) {
List<Class<?>> defaultGroupSequence = new ArrayList<>();
defaultGroupSequence.add(Test7Form1.class);
if (ObjectUtils.isEmpty(test7Form1)) {
return defaultGroupSequence;
}
// 獲取角色code
Integer role = Optional.ofNullable(test7Form1.getRole()).orElse(0) ;
if (!roleList.contains(role)) {
return defaultGroupSequence;
}
// 根據(jù)角色code,開啟相應(yīng)的組校驗
if (role == 1) {
defaultGroupSequence.add(Test7Form1.GuestGroup.class);
} else if (role == 2) {
defaultGroupSequence.add(Test7Form1.LeaderGroup.class);
} else if (role == 3) {
defaultGroupSequence.add(Test7Form1.AdminGroup.class);
}
return defaultGroupSequence;
}
}
?Controller層進(jìn)行校驗
@Controller
@RequestMapping("/test7")
public class Test7Controller {
@Resource
private LocalValidatorFactoryBean validator;
@GetMapping("/init")
public ModelAndView init() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("test7");
return modelAndView;
}
@PostMapping("/groupSequenceProvider")
@ResponseBody
public void groupSequenceProvider(@RequestBody Test7Form1 form) {
Set<ConstraintViolation<Test7Form1>> validate = validator.validate(form);
for (ConstraintViolation<Test7Form1> bean : validate) {
// 獲取當(dāng)前的校驗信息
String message = bean.getMessage();
System.out.println(message);
}
}
}
當(dāng)角色為2(領(lǐng)導(dǎo))時,最多只能有4個權(quán)限,因此顯示校驗信息

當(dāng)角色為1(訪客)時,最多只能有2個權(quán)限,因此顯示校驗信息

當(dāng)角色為3(管理員)時,最多有10個權(quán)限,因此無校驗信息

到此這篇關(guān)于SpringBoot @GroupSequenceProvider注解實現(xiàn)bean多屬性聯(lián)合校驗的文章就介紹到這了,更多相關(guān)SpringBoot聯(lián)合校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot?使用?Sa-Token?完成注解鑒權(quán)功能(權(quán)限校驗)
- SpringBoot通過自定義注解實現(xiàn)參數(shù)校驗
- SpringBoot通過AOP與注解實現(xiàn)入?yún)⑿r炘斍?/a>
- SpringBoot常見get/post請求參數(shù)處理、參數(shù)注解校驗及參數(shù)自定義注解校驗詳解
- SpringBoot中@Pattern注解對時間格式校驗方式
- SpringBoot自定義注解API數(shù)據(jù)加密和簽名校驗
- SpringBoot中自定義注解實現(xiàn)參數(shù)非空校驗的示例
- SpringBoot @Validated注解實現(xiàn)參數(shù)分組校驗的方法實例
- springboot自定義校驗注解的實現(xiàn)過程
相關(guān)文章
Spring Junit測試找不到SpringJUnit4ClassRunner.class的解決
這篇文章主要介紹了Spring Junit測試找不到SpringJUnit4ClassRunner.class的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
springboot編程式事務(wù)TransactionTemplate的使用說明
這篇文章主要介紹了springboot編程式事務(wù)TransactionTemplate的使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
springboot整合mybatis中的問題及出現(xiàn)的一些問題小結(jié)
這篇文章主要介紹了springboot整合mybatis中的問題及出現(xiàn)的一些問題小結(jié),本文給出了解決方案,需要的朋友可以參考下2018-11-11
VScode 打造完美java開發(fā)環(huán)境最新教程
這篇文章主要介紹了VScode 打造完美java開發(fā)環(huán)境最新教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
使用springboot的jar包能夠以service方式啟動
這篇文章主要介紹了使用springboot的jar包能夠以service方式啟動,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
js判斷是否是移動設(shè)備登陸網(wǎng)頁的簡單方法
這篇文章主要介紹了js判斷是否是移動設(shè)備登陸網(wǎng)頁的簡單方法,需要的朋友可以參考下2014-02-02
java實現(xiàn)oracle插入當(dāng)前時間的方法
這篇文章主要介紹了java實現(xiàn)oracle插入當(dāng)前時間的方法,以實例形式對比分析了java使用Oracle操作時間的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03

