概述
odataimpl.java 是 apache olingo odata 服务器核心组件中的关键实现类,负责创建和管理 odata 服务所需的各种组件。该类是抽象类 odata 的具体实现,采用工厂模式为 odata 服务提供各种序列化器、反序列化器、处理器等核心组件。
主要职责
- 工厂模式: 负责创建 odata 服务的各种核心组件
- 版本管理: 支持 odata v4.0 和 v4.01 多版本
- 格式支持: 支持 json 和 xml 数据格式
- 组件创建: 统一管理序列化器、反序列化器、处理器等组件的创建
类结构与继承关系
核心功能分析
1. 序列化器管理
odataimpl 负责创建不同类型的序列化器:
- 标准序列化器 (
odataserializer): 用于标准的 odata 响应序列化 - edm 辅助序列化器 (
edmassistedserializer): 在缺少完整 edm 信息时使用。详见《olingo分析和实践——edm 辅助序列化器详解》 - delta 序列化器 (
edmdeltaserializer): 用于增量响应序列化。 - 固定格式序列化器 (
fixedformatserializer): 用于二进制或特定格式序列化
2. 反序列化器管理
提供多种反序列化器创建方式:
- 基础反序列化器: 处理基本的内容类型反序列化
- 元数据增强反序列化器: 结合 servicemetadata 提供更丰富的反序列化功能
- 版本感知反序列化器: 根据 odata 版本选择合适的反序列化策略
3. 处理器管理
创建不同类型的 odata 请求处理器:
- http 处理器 (
odatahttphandler): 处理 http 上下文中的 odata 请求 - 原始处理器 (
odatahandler): 提供更底层的请求处理能力
重要方法详解
createedmassistedserializer 方法
这是用户选择的重点方法,用于创建 edm 辅助序列化器:
@override
public edmassistedserializer createedmassistedserializer(final contenttype contenttype) throws serializerexception {
if (contenttype != null && contenttype.iscompatible(contenttype.application_json)) {
return new edmassistedjsonserializer(contenttype);
}
throw new serializerexception("unsupported format: " +
((contenttype != null) ? contenttype.tocontenttypestring() : null),
serializerexception.messagekeys.unsupported_format,
((contenttype != null) ? contenttype.tocontenttypestring() : null));
}版本感知的重载方法:
@override
public edmassistedserializer createedmassistedserializer(final contenttype contenttype,
list<string> versions) throws serializerexception {
iconstants constants = new constantsv00();
if(versions!=null && !versions.isempty() && getmaxversion(versions) > 4){
constants = new constantsv01() ;
}
if (contenttype != null && contenttype.iscompatible(contenttype.application_json)) {
return new edmassistedjsonserializer(contenttype, constants);
}
throw new serializerexception("unsupported format: " +
((contenttype != null) ? contenttype.tocontenttypestring() : null),
serializerexception.messagekeys.unsupported_format,
((contenttype != null) ? contenttype.tocontenttypestring() : null));
}
功能特点:
- 目前仅支持 json 格式
- 支持版本差异化处理
- 在没有完整 edm 信息时提供序列化能力
- 根据版本选择合适的常量配置
版本管理机制
版本检测算法

getmaxversion 方法分析
private float getmaxversion(list<string> versions) {
float versionvalue [] = new float [versions.size()];
int i=0;
float max=new float(0);
for(string version:versions){
float ver = float.valueof(version);
versionvalue[i++] = ver;
max = max > ver ? max : ver ;
}
return max;
}
算法特点:
- 遍历所有版本字符串
- 转换为 float 进行数值比较
- 返回最大版本号
- 用于决定使用哪个版本的常量配置
序列化器创建流程
标准序列化器创建流程

edm 辅助序列化器创建流程

delta 序列化器创建流程

反序列化器创建流程
基础反序列化器创建

版本感知反序列化器创建

错误处理机制
异常类型
- serializerexception: 序列化相关错误
- deserializerexception: 反序列化相关错误
错误处理策略

典型错误处理代码
if (serializer == null) {
throw new serializerexception("unsupported format: " +
((contenttype != null) ? contenttype.tocontenttypestring() : null),
serializerexception.messagekeys.unsupported_format,
((contenttype != null) ? contenttype.tocontenttypestring() : null));
}
设计模式与架构
1. 工厂模式 (factory pattern)
odataimpl 作为工厂类,负责创建各种 odata 组件:

2. 策略模式 (strategy pattern)
根据版本和内容类型选择不同的处理策略:

3. 模板方法模式 (template method pattern)
抽象父类定义创建组件的模板,子类实现具体逻辑:

使用示例
创建基础序列化器
// 创建 odata 实例 odata odata = odata.newinstance(); // 创建 json 序列化器 contenttype jsoncontenttype = contenttype.application_json; odataserializer serializer = odata.createserializer(jsoncontenttype); // 创建 xml 序列化器 contenttype xmlcontenttype = contenttype.application_xml; odataserializer xmlserializer = odata.createserializer(xmlcontenttype);
创建版本感知的序列化器
// 创建支持 v4.01 的序列化器
list<string> versions = arrays.aslist("4.01", "4.0");
odataserializer serializer = odata.createserializer(
contenttype.application_json, versions);
创建 edm 辅助序列化器
// 创建 edm 辅助序列化器(用户选择的重点)
edmassistedserializer edmserializer = odata.createedmassistedserializer(
contenttype.application_json);
// 创建版本感知的 edm 辅助序列化器
list<string> versions = arrays.aslist("4.01");
edmassistedserializer versionedserializer = odata.createedmassistedserializer(
contenttype.application_json, versions);创建 delta 序列化器
// 创建 delta 序列化器
list<string> versions = arrays.aslist("4.01");
edmdeltaserializer deltaserializer = odata.createedmdeltaserializer(
contenttype.application_json, versions);
创建反序列化器
// 创建基础反序列化器
odatadeserializer deserializer = odata.createdeserializer(
contenttype.application_json);
// 创建带元数据的反序列化器
servicemetadata metadata = odata.createservicemetadata(
edmprovider, references);
odatadeserializer metadatadeserializer = odata.createdeserializer(
contenttype.application_json, metadata);重要组件说明
1. 常量类 (constants)
- constantsv00: odata v4.0 版本常量
- constantsv01: odata v4.01 版本常量
2. 序列化器类型
| 序列化器类型 | 用途 | 支持格式 |
|---|---|---|
| odataserializer | 标准 odata 响应序列化 | json, xml |
| edmassistedserializer | 缺少 edm 信息时的序列化 | json |
| edmdeltaserializer | 增量响应序列化 | json |
| fixedformatserializer | 固定格式序列化 | binary, multipart |
3. 内容类型支持
| 内容类型 | 元数据级别 | 描述 |
|---|---|---|
| application_json | minimal | 最小元数据(默认) |
| application_json | none | 无元数据 |
| application_json | full | 完整元数据 |
| application_xml | - | xml 格式 |
| application_atom_xml | - | atom xml 格式 |
总结
odataimpl.java 是 apache olingo odata 框架的核心工厂类,具有以下关键特点:
- 职责单一: 专注于组件创建,遵循单一职责原则
- 版本兼容: 支持多个 odata 版本,保证向后兼容性
- 格式丰富: 支持 json 和 xml 多种数据格式
- 错误健壮: 提供完善的错误处理机制
- 扩展性强: 采用工厂模式,便于添加新的组件类型
该类是整个 odata 服务架构的重要基础设施,为上层应用提供了统一、可靠的组件创建服务。通过理解这个类的设计和实现,可以更好地掌握 odata 服务的核心架构和运行机制。
到此这篇关于olingo分析和实践之odataimpl详细分析的文章就介绍到这了,更多相关olingo odataimpl内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论