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分别代表同一个字段情况下的验证规则灵活使用,它带来了灵活性。

参考内容

  1. https://reflectoring.io/bean-validation-with-spring-boot/
发布了478 篇原创文章 · 获赞 804 · 访问量 433万+

猜你喜欢

转载自blog.csdn.net/blueheart20/article/details/88817754