版本
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 学习-全局异常处理过滤器
网友评论