Spring Boot 之groups應對不同的Validation規則自定義

bladestone發表於2019-03-26

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分別代表同一個欄位情況下的驗證規則靈活使用,它帶來了靈活性。

參考內容

  1. https://reflectoring.io/bean-validation-with-spring-boot/

相關文章