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/
  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Spring Boot中使用AOP和自定义注解可以帮助我们更方便地进行方法的拦截和处理。下面是一种最佳实践过程: 1. 首先,我们需要引入`spring-boot-starter-aop`依赖。可以在`pom.xml`文件中添加如下内容: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> ``` 2. 创建一个自定义注解。可以使用`@interface`关键字创建一个注解类,并在注解类中定义需要的属性。例如: ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { // 定义需要的属性 } ``` 3. 创建一个切面类。切面类用来定义需要进行拦截和处理的方法。可以使用`@Aspect`注解标记该类,并使用`@Around`注解指定要拦截处理的目标方法。例如: ```java @Aspect @Component public class MyAspect { @Around("@annotation(com.example.MyAnnotation)") public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable { // 在方法执行前进行处理 // ... Object result = joinPoint.proceed(); // 在方法执行后进行处理 // ... return result; } } ``` 4. 在Spring Boot的启动类上添加`@EnableAspectJAutoProxy`注解,开启AOP的支持。例如: ```java @SpringBootApplication @EnableAspectJAutoProxy public class Application { // ... } ``` 5. 在需要应用切面的方法上添加自定义注解。 ```java @MyAnnotation public void someMethod() { // ... } ``` 通过以上步骤,我们就可以成功地在Spring Boot中使用AOP和自定义注解来进行方法的拦截和处理了。需要注意的是,如果定义的注解只用于标记方法,而不需要定义属性,可以简化为一个空接口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值