说明:下面示例中采用
<joyrpc/>
标签 表示JOYRPC中的schema。
为了跨语言和跨协议调用,需要对数据进行一定的规范。系统默认启用了参数类型校验,在程序启动的时候对不合法的参数类型进行警告或报错。
可以在全局参数或者Springboot的配置项中配置interface.validator.enable开启或关闭参数类型校验
可以在全局参数或者Springboot的配置项中配置interface.validator设置参数类型校验器
系统默认的参数类型校验器为standard,其读取"META-INF/system_standard_type"和classpath下的"system_standard_type"的类型定义
#### java
##
int
byte
short
long
float
double
boolean
char
void
java.lang.Integer
java.lang.Byte
java.lang.Short
java.lang.Long
java.lang.Float
java.lang.Double
java.lang.Boolean
java.lang.Character
java.lang.String
java.lang.Void
java.math.BigDecimal
java.util.Currency
java.util.Date
java.util.Collection
java.util.List
java.util.Map
java.util.Set
java.util.Queue
java.util.concurrent.CompletableFuture
参数校验功能是基于 JSR303 实现的,用户只需标识 JSR303 标准的验证 annotation。 Provider和Consumer都可以独立开启参数校验功能,支持接口级和方法级的配置。
public class ValidationBean implements Serializable {
private static final long serialVersionUID = -200698852458623917L;
@MyAnnotation // 自定义annotation
private String name;
@Pattern(regexp = "^\\s*\\w+(?:\\.{0,1}[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$")
private String email;
@Min(18) // 最小值
@Max(100) // 最大值
private int age;
public ValidationBean() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
@Constraint(validatedBy = {MyAnnotationValidator.class}) //指定校验类
@Documented
@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String message() default "不正确的状态 , 应该是 'created', 'paid', shipped', closed'其中之一";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class MyAnnotationValidator implements ConstraintValidator<MyAnnotation, String> {
private final String[] ALL_STATUS = {"created", "paid", "shipped", "closed"};
public void initialize(MyAnnotation status) {
}
public boolean isValid(String value, ConstraintValidatorContext context) {
if (Arrays.asList(ALL_STATUS).contains(value))
return true;
return false;
}
}
import javax.validation.Valid;
public interface DemoService {
ValidationBean validation(@Valid ValidationBean obj);
}
validation参数值设置为true
public class DemoServiceTest {
public void main() throws Exception {
ConsumerConfig<DemoService> consumerConfig = initConsumer();
consumerConfig.setValidation(true);
CompletableFuture<Void> future = new CompletableFuture<>();
DemoService service = consumerConfig.refer(future);
future.get();
try {
ValidationBean bean = new ValidationBean();
bean.setName("joyrpc-demo");
bean.setAge(1);
bean.setEmail("lafaa.com");
ValidationBean serverBean = service.validation(bean);
logger.info(serverBean.getName());
} catch (Exception e) {
logger.error("exception:", e);
}
Thread.currentThread().join();
}
}