springboot dubbo3 学习-集成Validation

版本
spring boot: 3.4.1
dubbo:3.3.1
java17

官方文档

1,Maven 引入

用这个

       <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>8.0.2.Final</version>
       </dependency>

不要用这个,会出现死循环的问题,具体原因不详,大概率是版本冲突

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

2,开启验证功能

全局开启,consumer端验证一定要开启,这样会提升新能也会免去一些麻烦

dubbo:
  provider:
    validation: true
  consumer:
    validation: true

通过注解开启

@DubboService(validation = "true")

@DubboReference(validation = "true")

3,接口定义

Validation的注解一定要写在接口上,否则不会起作用。
spring boot的可以写在实现类上。

public interface ITestConsumerSevice {

    String testv(@NotNull String userId);
}

4,自定义验证注解

注解

@Target({
        ElementType.METHOD,
        ElementType.FIELD,
        ElementType.ANNOTATION_TYPE,
        ElementType.CONSTRUCTOR,
        ElementType.PARAMETER,
        ElementType.TYPE_USE
})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
        validatedBy = MobileValidator.class
)
public @interface Mobile {

    String message() default "手机号格式不正确";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

}

验证类

public class MobileValidator implements ConstraintValidator<Mobile, String> {

    @Override
    public void initialize(Mobile annotation) {
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 如果手机号为空,默认不校验,即校验通过
        if (StrUtil.isEmpty(value)) {
            return true;
        }
        // 校验手机
        return ValidationUtils.isMobile(value);
    }

}

使用

public interface ITestConsumerSevice {

    String testv(@Mobile String userId);
}

可以参照这篇文章

5,全局异常处理

因为Validation 验证失败后直接抛出异常,所以我们需要统一处理一下
参照:springboot dubbo3 学习-全局异常处理过滤器

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容