<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
分組序列@GroupSequenceProvider、@GroupSequence控制資料校驗順序,解決多欄位聯合邏輯校驗問題【享學Spring MVC】
Hibernate Validator提供了非標準的
@GroupSequenceProvider註解
。針對當前物件範例的狀態,動態來決定載入那些校驗組進入預設校驗組。
需要藉助Hibernate Validation提供給我們的DefaultGroupSequenceProvider介面
來處理那些屬性在什麼情況下進入指定的分組。
⏹自定義校驗數值不能為空的註解
@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); } } }
⏹前臺
<!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">校驗資料</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 // 通過該註解所對應的自定義Provider來實現多屬性聯合校驗 @GroupSequenceProvider(ValidateTest7FormProvider.class) public class Test7Form { /** * 1: 稽核中 * 2: 人工初審拒絕 * 3: 人工初審通過 */ @ValidateIntegerNotEmpty(msgArgs = "稽核狀態型別") @Range(min = 1, max = 3, message = "稽核拒絕原因:引數傳遞錯誤") private Integer auditStatus; /** * 1: 不符合准入要求 * 2: 三方資料拒貸 * 3: 授信額度為0 * 4: 其他 */ @ValidateIntegerNotEmpty(msgArgs = "稽核拒絕原因", groups = auditGroup.class) @Range(min = 1, max = 4, message = "稽核拒絕原因:引數傳遞錯誤", 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; } // 獲取 人工初審 狀態 Integer auditStatus = Optional.ofNullable(test7Form.getAuditStatus()).orElse(0) ; // 如果 人工初審通過的話,稽核拒絕原因的auditGroup組就會起作用,就變為必填專案,否則為選填專案 if (auditStatus == 2) { defaultGroupSequence.add(Test7Form.auditGroup.class); } return defaultGroupSequence; } }
⏹Controller層進行校驗
@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) { // 獲取當前的校驗資訊 String message = bean.getMessage(); System.out.println(message); } } }
當引數auditStatus為2(人工初審拒絕)時,auditRejectReason(稽核拒絕原因)超出了1到4的範圍,因此顯示出校驗資訊
當引數auditStatus為2(人工初審拒絕)時,auditRejectReason(稽核拒絕原因)為必填項,因此顯示出校驗資訊
當引數auditStatus為3(人工初審通過)時,auditRejectReason(稽核拒絕原因)為非必填項,因此無校驗失敗資訊
⏹前臺
<!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">校驗資料</button> <h1>我是test7的頁面</h1> </body> <script> $("#btn").click(() => { const param2 = { // 領導(2)存取 role: 2, // 許可權的數量為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 // 通過該註解所對應的自定義Provider來實現多屬性聯合校驗 @GroupSequenceProvider(ValidateTest7Form1Provider.class) public class Test7Form1 { /** * 1: 訪客 * 2: 領導 * 3: 管理員 */ @ValidateIntegerNotEmpty(msgArgs = "角色型別") @Range(min = 1, max = 3, message = "錯誤原因:引數傳遞錯誤") private Integer role; @Size.List({ // 訪客1個許可權 @Size(min = 1, max = 2, message = "訪客最多擁有2個許可權", groups = GuestGroup.class), // 領導4個許可權 @Size(min = 1, max = 4, message = "領導最多擁有4個許可權", groups = LeaderGroup.class), // 管理員10個許可權 @Size(min = 1, max = 10, message = "管理員最多擁有10個許可權", groups = AdminGroup.class) }) private List<Integer> permissionList; // 遊客分組 public interface GuestGroup { } // 領導分組 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: 領導 * 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; } // 根據角色code,開啟相應的組校驗 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層進行校驗
@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) { // 獲取當前的校驗資訊 String message = bean.getMessage(); System.out.println(message); } } }
當角色為2(領導)時,最多隻能有4個許可權,因此顯示校驗資訊
當角色為1(訪客)時,最多隻能有2個許可權,因此顯示校驗資訊
當角色為3(管理員)時,最多有10個許可權,因此無校驗資訊
到此這篇關於SpringBoot @GroupSequenceProvider註解實現bean多屬性聯合校驗的文章就介紹到這了,更多相關SpringBoot聯合校驗內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45