持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
背景
dubbo泛化调用最重要的一步是参数解析。需要提供参数类型,以及参数值。开发者只能提供参数名,参数类型名,以及调用时提供的参数值(String)。
因此需要进行参数解析,同过参数类型名,获取参数类型。将参数值(String)转换为参数实际类型值。
目标参数结构
参数类型名--参数值
已有参数结构信息
参数名--参数类型名---参数值(String)
根据已有参数结构信息,获取目标参数结构,只需要将String 参数值转化为实际参数值
转化参数值
参数类型先简单分为基本类型与简单类类型。
基本类型
对于基本类型与对应的包装类型
可以根据类型名直接将String转换为对应类型的参数值。
| 基本类型 | 包装类 |
|---|---|
| boolean | Boolean |
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
POJO简单类类型
对于自定义简单类类型
如下面的User类,其参数类型名即为其所在包路径:如com.pdd.User;
class User {
String name;
int id;
int age;
已有的String参数值如表示为json为:
{
"name":"aaa",
"id":1001,
"age":23
}
为了远程dubbo服务能识别所传过去的参数值的类型,需要使用如下map,来指定参数值的类型,
{
"class":"com.pdd.User" //标识具体类型
"name":"aaa",
"id":1001,
"age":23
}
参数配置
能力接入时,需要存储能力下的调用接口(dubbo)的配置
class ServiceConfig{
String serviceName;
String methodName;
List<ParamConfig> paramConfig;
}
class ParamConfig{
String paramName; //参数名
String paramType; //参数类型
List<AttributeConfig> attributeConfig;
}
class AttributeConfig{
String attrName; //属性名
String attrType; //属性类型
List<AttributeConfig> subAttributeConfig; //子属性
}
列入对于服务testService 的方法test(Person person);
class Person {
String name;
Student student;
}
class Student {
int id;
int level;
}
参照上述配置,需要前端提供的json为:
{
"serviceName":"com.pdd.testService", //服务名
"methodName":"test", //方法名
"paramConfig":[ //参数配置
{
"paramName":"person",
"paramType":"com.pdd.model.Person",
"attributeConfig":[
{
"attrName":"name",
"attrType":"java.lang.String"
"subAttributeConfig":[]
},
{
"attrName":"student",
"attrType":"com.pdd.model.Student"
"subAttributeConfig":[
{
"attrName":"id"
"attrType":"int",
"subAttributeConfig":[]
},
{
"attrName":"level"
"attrType":"int",
"subAttributeConfig":[]
}
]
]
}
]
}
根据以上配置,进行值填充后,可构建对应的map,作为该参数类型的参数值