Spring Boot 之groups應對不同的Validation規則自定義
groups
如果同一個規則,在不同場景下,或許執行不同的驗證邏輯,在這種情況下,該如何來處理呢?本節將基於groups欄位來實現靈活的驗證。
這個groups是各類Validation註解中的一個屬性資訊,其定義如下:
@Target({ElementType.FIELD})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = IPAddressValidator.class)
public @interface IPAddress {
String message() default "{ipaddress.invalid}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
其中groups在IPAddress中的一個屬性。
定義Maker介面
兩種情況的介面類:
public interface CreateAction {
}
public interface UpdateAction {
}
這兩個介面分別代表兩種不同的型別資訊。
定義實體Bean
實體Bean類中包含兩組的驗證規則,這些規則甚至都是衝突的,通過groups來實現規則的選取和靈活使用:
@Data
public class BeanInGroup {
@Null(groups = CreateAction.class)
@NotNull(groups = UpdateAction.class)
private Long id;
}
在這裡的id,對於不同的groups分別定義不同的validation規則。
定義使用實體Bean服務
定義定義這些Bean的服務:
@Validated
@Service
@Slf4j
public class BeanGroupService {
@Validated(CreateAction.class)
public void validateInCreate(@Valid BeanInGroup beanGroup) {
log.info("validateInCreate:{}", beanGroup);
}
@Validated(UpdateAction.class)
public void validateInUpdate(@Valid BeanInGroup beanGroup) {
log.info("validateInUpdate:{}", beanGroup);
}
}
在@Validated註解中,通過不同的groups資訊型別,來實現規則的靈活定義。
單元測試
測試程式碼如下:
@RunWith(SpringRunner.class)
@SpringBootTest
public class BeanGroupTest {
@Autowired
private BeanGroupService beanGroupService;
@Test
public void testValidGroup() {
BeanInGroup bean = new BeanInGroup();
bean.setId(null);
this.beanGroupService.validateInCreate(bean);
bean.setId(12l);
this.beanGroupService.validateInUpdate(bean);
}
@Test(expected = ConstraintViolationException.class)
public void testInvalidGroup() {
BeanInGroup bean = new BeanInGroup();
bean.setId(12l);
this.beanGroupService.validateInCreate(bean);
bean.setId(null);
this.beanGroupService.validateInUpdate(bean);
}
}
上述的程式碼驗證了兩種情況,分別覆蓋了各類group情況。
總結
groups分別代表同一個欄位情況下的驗證規則靈活使用,它帶來了靈活性。
參考內容
相關文章
- Spring Boot之Validation自定義實現總結Spring Boot
- 使用jakarta.validation自定義校驗規則
- 小代學Spring Boot之自定義StarterSpring Boot
- Spring Boot之自定義JSON轉換器Spring BootJSON
- 自定義 Spring Boot StarterSpring Boot
- Spring Boot 自定義 starterSpring Boot
- 自定義Spring Boot StarterSpring Boot
- Laravel 自定義規則Laravel
- 【spring-boot】自定義starterSpringboot
- zuul 自定義路由規則Zuul路由
- spring boot 自定義規則訪問獲取內部或者外部靜態資源圖片Spring Boot
- Spring Boot 自定義註解失效Spring Boot
- Spring Boot - 自定義 Banner 圖案Spring Boot
- ETL中如何自定義規則
- Spring Boot四大神器之建立自定義StarterSpring Boot
- (第五講)自定義Spring Boot StarterSpring Boot
- SELinux: 如何讓selinux對某些命令放行,自定義selinux規則。Linux
- Laravel 自定義表單驗證-自定義驗證規則Laravel
- 對於同步的規則定義
- Laravel 自定義驗證規則的問題Laravel
- Spring Boot讀取自定義外部屬性Spring Boot
- Spring Boot + liteflow 規則引擎,太香了!Spring Boot
- jQuery Validate新增自定義驗證規則jQuery
- spring-boot 使用hibernate validation對引數進行優雅的校驗Springboot
- spring boot學習(2): SpringApplication和自定義bannerSpring BootAPP
- spring boot學習(5): 程式exit code自定義Spring Boot
- 最詳細的自定義Spring Boot Starter開發教程Spring Boot
- 線上debug&gateway自定義路由規則Gateway路由
- 自定義Mybatis自動生成程式碼規則MyBatis
- HTML5 pattern自定義驗證規則HTML
- 團隊自定義 tslint & eslint 詳細規則EsLint
- 關於laravel使用自定義驗證規則後某些規則不生效Laravel
- [Laravel] 自定義配置你的密碼驗證規則Laravel密碼
- 【Laravel】 自定義配置你的密碼驗證規則Laravel密碼
- 【Spring註解驅動開發】自定義TypeFilter指定@ComponentScan註解的過濾規則SpringFilter
- spring boot啟動掃描不到自定義註解Spring Boot
- Spring Boot 中關於自定義異常處理的套路!Spring Boot
- Spring Boot中實現規則引擎原始碼教程Spring Boot原始碼