68人参与 • 2025-07-21 • websocket
在odataspringbootservice.processodatarequest()方法中,odata框架核心组件初始化是整个请求处理流程的关键步骤。这个过程包含两个核心组件的创建:odata实例和servicemetadata服务元数据。
// odata framework initialization - same pattern as carsservlet
odata odata = odata.newinstance();
servicemetadata servicemetadata = odata.createservicemetadata(
new springbootedmprovider(),
new arraylist<>()
);odata odata = odata.newinstance();
核心作用:
内部机制:
// apache olingo框架内部实现逻辑(简化版)
public static odata newinstance() {
return new odataimpl();
}
提供的核心能力:
// json序列化器 odataserializer jsonserializer = odata.createserializer(contenttype.json); // xml序列化器 odataserializer xmlserializer = odata.createserializer(contenttype.application_xml); // atom序列化器 odataserializer atomserializer = odata.createserializer(contenttype.application_atom_xml);
// 请求体反序列化 odatadeserializer deserializer = odata.createdeserializer(contenttype.json);
// odata uri解析和验证 uriinfo uriinfo = odata.createurihelper().parseuri(uri, servicemetadata);
// http请求处理器创建 odatahttphandler handler = odata.createhandler(servicemetadata);
servicemetadata servicemetadata = odata.createservicemetadata(
new springbootedmprovider(), // edm提供者
new arraylist<>() // 引用列表
);
参数详解:
核心职责:
继承关系:
springbootedmprovider extends csdlabstractedmprovider
作用:

public static final string namespace = "org.apache.olingo.sample.springboot"; public static final string container_name = "springbootcontainer"; public static final fullqualifiedname container = new fullqualifiedname(namespace, container_name); // 实体类型 public static final string et_car_name = "car"; public static final fullqualifiedname et_car_fqn = new fullqualifiedname(namespace, et_car_name); // 实体集合 public static final string es_cars_name = "cars";
设计意义:
@override
public csdlentitytype getentitytype(fullqualifiedname entitytypename) throws odataexception {
if (entitytypename.equals(et_car_fqn)) {
return getcarentitytype();
}
return null;
}执行流程:
car实体类型的详细构建:
private csdlentitytype getcarentitytype() {
// 1. 定义属性
csdlproperty id = new csdlproperty().setname("id")
.settype(edmprimitivetypekind.int32.getfullqualifiedname());
csdlproperty brand = new csdlproperty().setname("brand")
.settype(edmprimitivetypekind.string.getfullqualifiedname());
csdlproperty model = new csdlproperty().setname("model")
.settype(edmprimitivetypekind.string.getfullqualifiedname());
csdlproperty color = new csdlproperty().setname("color")
.settype(edmprimitivetypekind.string.getfullqualifiedname());
csdlproperty year = new csdlproperty().setname("year")
.settype(edmprimitivetypekind.int32.getfullqualifiedname());
csdlproperty price = new csdlproperty().setname("price")
.settype(edmprimitivetypekind.double.getfullqualifiedname());
// 2. 定义主键
csdlpropertyref propertyref = new csdlpropertyref();
propertyref.setname("id");
// 3. 组装实体类型
csdlentitytype entitytype = new csdlentitytype();
entitytype.setname(et_car_name);
entitytype.setproperties(arrays.aslist(id, brand, model, color, year, price));
entitytype.setkey(collections.singletonlist(propertyref));
return entitytype;
}属性映射对照表:
| 属性名 | odata类型 | java类型 | 说明 |
|---|---|---|---|
| id | int32 | integer | 主键,唯一标识 |
| brand | string | string | 品牌名称 |
| model | string | string | 车型型号 |
| color | string | string | 颜色信息 |
| year | int32 | integer | 生产年份 |
| price | double | double | 价格信息 |
@override
public csdlentityset getentityset(fullqualifiedname entitycontainer, string entitysetname) throws odataexception {
if (entitycontainer.equals(container)) {
if (entitysetname.equals(es_cars_name)) {
return getcarentityset();
}
}
return null;
}执行逻辑:
实体集合构建:
private csdlentityset getcarentityset() {
csdlentityset entityset = new csdlentityset();
entityset.setname(es_cars_name); // 集合名称:cars
entityset.settype(et_car_fqn); // 集合类型:car实体类型
return entityset;
}
@override
public csdlentitycontainer getentitycontainer() throws odataexception {
// 创建实体容器
csdlentitycontainer entitycontainer = new csdlentitycontainer();
entitycontainer.setname(container_name);
// 添加实体集合
list<csdlentityset> entitysets = new arraylist<>();
entitysets.add(getentityset(container, es_cars_name));
entitycontainer.setentitysets(entitysets);
return entitycontainer;
}容器作用:
@override
public list<csdlschema> getschemas() throws odataexception {
list<csdlschema> schemas = new arraylist<>();
csdlschema schema = new csdlschema();
schema.setnamespace(namespace);
// 添加实体类型
list<csdlentitytype> entitytypes = new arraylist<>();
entitytypes.add(getentitytype(et_car_fqn));
schema.setentitytypes(entitytypes);
// 添加实体容器
schema.setentitycontainer(getentitycontainer());
schemas.add(schema);
return schemas;
}模式结构:
schema: org.apache.olingo.sample.springboot
├── entitytypes
│ └── car (id, brand, model, color, year, price)
└── entitycontainer: springbootcontainer
└── entitysets
└── cars -> car
servicemetadata servicemetadata = odata.createservicemetadata(edmprovider, references);
内部验证步骤:
当访问 http://localhost:8080/cars.svc/$metadata 时,会返回:
<?xml version="1.0" encoding="utf-8"?>
<edmx:edmx version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:dataservices>
<schema namespace="org.apache.olingo.sample.springboot"
xmlns="http://docs.oasis-open.org/odata/ns/edm">
<!-- 实体类型定义 -->
<entitytype name="car">
<key>
<propertyref name="id"/>
</key>
<property name="id" type="edm.int32"/>
<property name="brand" type="edm.string"/>
<property name="model" type="edm.string"/>
<property name="color" type="edm.string"/>
<property name="year" type="edm.int32"/>
<property name="price" type="edm.double"/>
</entitytype>
<!-- 实体容器定义 -->
<entitycontainer name="springbootcontainer">
<entityset name="cars" entitytype="org.apache.olingo.sample.springboot.car"/>
</entitycontainer>
</schema>
</edmx:dataservices>
</edmx:edmx>访问 http://localhost:8080/cars.svc/ 时的服务文档:
{
"@odata.context": "$metadata",
"value": [
{
"name": "cars",
"kind": "entityset",
"url": "cars"
}
]
}
// 错误示例:实体类型未定义
@override
public csdlentitytype getentitytype(fullqualifiedname entitytypename) {
// 忘记实现返回null,导致"entity type not found"错误
return null;
}
// 错误示例:类型引用错误
csdlproperty id = new csdlproperty().setname("id")
.settype(edmprimitivetypekind.string.getfullqualifiedname()); // 应该是int32

odata框架核心组件初始化是整个odata服务的基础,它完成了以下关键任务:
这个过程为后续的http处理器创建和请求处理奠定了坚实的基础,是odata服务能够正确响应各种请求的前提条件。
到此这篇关于olingo分析和实践之odata框架核心组件初始化的文章就介绍到这了,更多相关olingo odata框架内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论