Olingo分析和實(shí)踐之ODataImpl詳細(xì)分析(重要方法詳解)
概述
ODataImpl.java
是 Apache Olingo OData 服務(wù)器核心組件中的關(guān)鍵實(shí)現(xiàn)類(lèi),負(fù)責(zé)創(chuàng)建和管理 OData 服務(wù)所需的各種組件。該類(lèi)是抽象類(lèi) OData
的具體實(shí)現(xiàn),采用工廠模式為 OData 服務(wù)提供各種序列化器、反序列化器、處理器等核心組件。
主要職責(zé)
- 工廠模式: 負(fù)責(zé)創(chuàng)建 OData 服務(wù)的各種核心組件
- 版本管理: 支持 OData v4.0 和 v4.01 多版本
- 格式支持: 支持 JSON 和 XML 數(shù)據(jù)格式
- 組件創(chuàng)建: 統(tǒng)一管理序列化器、反序列化器、處理器等組件的創(chuàng)建
類(lèi)結(jié)構(gòu)與繼承關(guān)系
核心功能分析
1. 序列化器管理
ODataImpl 負(fù)責(zé)創(chuàng)建不同類(lèi)型的序列化器:
- 標(biāo)準(zhǔn)序列化器 (
ODataSerializer
): 用于標(biāo)準(zhǔn)的 OData 響應(yīng)序列化 - EDM 輔助序列化器 (
EdmAssistedSerializer
): 在缺少完整 EDM 信息時(shí)使用。詳見(jiàn)《Olingo分析和實(shí)踐——EDM 輔助序列化器詳解》 - Delta 序列化器 (
EdmDeltaSerializer
): 用于增量響應(yīng)序列化。 - 固定格式序列化器 (
FixedFormatSerializer
): 用于二進(jìn)制或特定格式序列化
2. 反序列化器管理
提供多種反序列化器創(chuàng)建方式:
- 基礎(chǔ)反序列化器: 處理基本的內(nèi)容類(lèi)型反序列化
- 元數(shù)據(jù)增強(qiáng)反序列化器: 結(jié)合 ServiceMetadata 提供更豐富的反序列化功能
- 版本感知反序列化器: 根據(jù) OData 版本選擇合適的反序列化策略
3. 處理器管理
創(chuàng)建不同類(lèi)型的 OData 請(qǐng)求處理器:
- HTTP 處理器 (
ODataHttpHandler
): 處理 HTTP 上下文中的 OData 請(qǐng)求 - 原始處理器 (
ODataHandler
): 提供更底層的請(qǐng)求處理能力
重要方法詳解
createEdmAssistedSerializer 方法
這是用戶選擇的重點(diǎn)方法,用于創(chuàng)建 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)); }
功能特點(diǎn):
- 目前僅支持 JSON 格式
- 支持版本差異化處理
- 在沒(méi)有完整 EDM 信息時(shí)提供序列化能力
- 根據(jù)版本選擇合適的常量配置
版本管理機(jī)制
版本檢測(cè)算法
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; }
算法特點(diǎn):
- 遍歷所有版本字符串
- 轉(zhuǎn)換為 Float 進(jìn)行數(shù)值比較
- 返回最大版本號(hào)
- 用于決定使用哪個(gè)版本的常量配置
序列化器創(chuàng)建流程
標(biāo)準(zhǔn)序列化器創(chuàng)建流程
EDM 輔助序列化器創(chuàng)建流程
Delta 序列化器創(chuàng)建流程
反序列化器創(chuàng)建流程
基礎(chǔ)反序列化器創(chuàng)建
版本感知反序列化器創(chuàng)建
錯(cuò)誤處理機(jī)制
異常類(lèi)型
- SerializerException: 序列化相關(guān)錯(cuò)誤
- DeserializerException: 反序列化相關(guān)錯(cuò)誤
錯(cuò)誤處理策略
典型錯(cuò)誤處理代碼
if (serializer == null) { throw new SerializerException("Unsupported format: " + ((contentType != null) ? contentType.toContentTypeString() : null), SerializerException.MessageKeys.UNSUPPORTED_FORMAT, ((contentType != null) ? contentType.toContentTypeString() : null)); }
設(shè)計(jì)模式與架構(gòu)
1. 工廠模式 (Factory Pattern)
ODataImpl 作為工廠類(lèi),負(fù)責(zé)創(chuàng)建各種 OData 組件:
2. 策略模式 (Strategy Pattern)
根據(jù)版本和內(nèi)容類(lèi)型選擇不同的處理策略:
3. 模板方法模式 (Template Method Pattern)
抽象父類(lèi)定義創(chuàng)建組件的模板,子類(lèi)實(shí)現(xiàn)具體邏輯:
使用示例
創(chuàng)建基礎(chǔ)序列化器
// 創(chuàng)建 OData 實(shí)例 OData odata = OData.newInstance(); // 創(chuàng)建 JSON 序列化器 ContentType jsonContentType = ContentType.APPLICATION_JSON; ODataSerializer serializer = odata.createSerializer(jsonContentType); // 創(chuàng)建 XML 序列化器 ContentType xmlContentType = ContentType.APPLICATION_XML; ODataSerializer xmlSerializer = odata.createSerializer(xmlContentType);
創(chuàng)建版本感知的序列化器
// 創(chuàng)建支持 v4.01 的序列化器 List<String> versions = Arrays.asList("4.01", "4.0"); ODataSerializer serializer = odata.createSerializer( ContentType.APPLICATION_JSON, versions);
創(chuàng)建 EDM 輔助序列化器
// 創(chuàng)建 EDM 輔助序列化器(用戶選擇的重點(diǎn)) EdmAssistedSerializer edmSerializer = odata.createEdmAssistedSerializer( ContentType.APPLICATION_JSON); // 創(chuàng)建版本感知的 EDM 輔助序列化器 List<String> versions = Arrays.asList("4.01"); EdmAssistedSerializer versionedSerializer = odata.createEdmAssistedSerializer( ContentType.APPLICATION_JSON, versions);
創(chuàng)建 Delta 序列化器
// 創(chuàng)建 Delta 序列化器 List<String> versions = Arrays.asList("4.01"); EdmDeltaSerializer deltaSerializer = odata.createEdmDeltaSerializer( ContentType.APPLICATION_JSON, versions);
創(chuàng)建反序列化器
// 創(chuàng)建基礎(chǔ)反序列化器 ODataDeserializer deserializer = odata.createDeserializer( ContentType.APPLICATION_JSON); // 創(chuàng)建帶元數(shù)據(jù)的反序列化器 ServiceMetadata metadata = odata.createServiceMetadata( edmProvider, references); ODataDeserializer metadataDeserializer = odata.createDeserializer( ContentType.APPLICATION_JSON, metadata);
重要組件說(shuō)明
1. 常量類(lèi) (Constants)
- Constantsv00: OData v4.0 版本常量
- Constantsv01: OData v4.01 版本常量
2. 序列化器類(lèi)型
序列化器類(lèi)型 | 用途 | 支持格式 |
---|---|---|
ODataSerializer | 標(biāo)準(zhǔn) OData 響應(yīng)序列化 | JSON, XML |
EdmAssistedSerializer | 缺少 EDM 信息時(shí)的序列化 | JSON |
EdmDeltaSerializer | 增量響應(yīng)序列化 | JSON |
FixedFormatSerializer | 固定格式序列化 | Binary, Multipart |
3. 內(nèi)容類(lèi)型支持
內(nèi)容類(lèi)型 | 元數(shù)據(jù)級(jí)別 | 描述 |
---|---|---|
APPLICATION_JSON | minimal | 最小元數(shù)據(jù)(默認(rèn)) |
APPLICATION_JSON | none | 無(wú)元數(shù)據(jù) |
APPLICATION_JSON | full | 完整元數(shù)據(jù) |
APPLICATION_XML | - | XML 格式 |
APPLICATION_ATOM_XML | - | Atom XML 格式 |
總結(jié)
ODataImpl.java
是 Apache Olingo OData 框架的核心工廠類(lèi),具有以下關(guān)鍵特點(diǎn):
- 職責(zé)單一: 專(zhuān)注于組件創(chuàng)建,遵循單一職責(zé)原則
- 版本兼容: 支持多個(gè) OData 版本,保證向后兼容性
- 格式豐富: 支持 JSON 和 XML 多種數(shù)據(jù)格式
- 錯(cuò)誤健壯: 提供完善的錯(cuò)誤處理機(jī)制
- 擴(kuò)展性強(qiáng): 采用工廠模式,便于添加新的組件類(lèi)型
該類(lèi)是整個(gè) OData 服務(wù)架構(gòu)的重要基礎(chǔ)設(shè)施,為上層應(yīng)用提供了統(tǒng)一、可靠的組件創(chuàng)建服務(wù)。通過(guò)理解這個(gè)類(lèi)的設(shè)計(jì)和實(shí)現(xiàn),可以更好地掌握 OData 服務(wù)的核心架構(gòu)和運(yùn)行機(jī)制。
到此這篇關(guān)于Olingo分析和實(shí)踐之ODataImpl詳細(xì)分析的文章就介紹到這了,更多相關(guān)Olingo ODataImpl內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java之String字符串在JVM中的存儲(chǔ)及其內(nèi)存地址的問(wèn)題
這篇文章主要介紹了Java之String字符串在JVM中的存儲(chǔ)及其內(nèi)存地址的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Java中println輸出漢字亂碼問(wèn)題一招解決方案
這篇文章主要介紹了Java中println輸出漢字亂碼問(wèn)題一招解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12Java中IO流的BufferedOutputStream和FileOutputStream對(duì)比
這篇文章主要介紹了Java中IO流的BufferedOutputStream和FileOutputStream對(duì)比,不帶緩沖的操作,每讀一個(gè)字節(jié)就要寫(xiě)入一個(gè)字節(jié),由于涉及磁盤(pán)的IO操作相比內(nèi)存的操作要慢很多,所以在讀寫(xiě)的字節(jié)比較少的情況下,效率比較低,需要的朋友可以參考下2023-07-07Java Web項(xiàng)目中使用Socket通信多線程、長(zhǎng)連接的方法
很多時(shí)候在javaweb項(xiàng)目中我們需要用到Socket通信來(lái)實(shí)現(xiàn)功能,在web中使用Socket我們需要建立一個(gè)監(jiān)聽(tīng)程序,在程序啟動(dòng)時(shí),啟動(dòng)socket監(jiān)聽(tīng)。接下來(lái)通過(guò)本文給大家介紹Java Web項(xiàng)目中使用Socket通信多線程、長(zhǎng)連接的方法,感興趣的朋友一起學(xué)習(xí)2016-04-04SpringCloud對(duì)服務(wù)內(nèi)某個(gè)client進(jìn)行單獨(dú)配置的操作步驟
我們的微服務(wù)項(xiàng)目用的是springCloud,某個(gè)微服務(wù)接口因?yàn)閿?shù)據(jù)處理量大,出現(xiàn)了接口超時(shí)的情況,我們需要單獨(dú)修改這一個(gè)feignClient的超時(shí)時(shí)間,所以本文介紹了SpringCloud對(duì)服務(wù)內(nèi)某個(gè)client進(jìn)行單獨(dú)配置的操作步驟,需要的朋友可以參考下2023-10-10springboot實(shí)現(xiàn)注冊(cè)加密與登錄解密功能(demo)
這篇文章主要介紹了springboot實(shí)現(xiàn)注冊(cè)的加密與登錄的解密功能,本文通過(guò)demo實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02SpringBoot異常錯(cuò)誤頁(yè)面實(shí)現(xiàn)方法介紹
在項(xiàng)目訪問(wèn)的時(shí)候我們經(jīng)常會(huì)發(fā)生錯(cuò)誤或者頁(yè)面找不到,比如:資源找不到404,服務(wù)器500錯(cuò)誤,默認(rèn)情況下springboot的處理機(jī)制都是去跳轉(zhuǎn)內(nèi)部的錯(cuò)誤地址:/error 和與之對(duì)應(yīng)的一個(gè)錯(cuò)誤頁(yè)面2022-09-09關(guān)于spring依賴注入的方式以及優(yōu)缺點(diǎn)
這篇文章主要介紹了關(guān)于spring依賴注入的方式以及優(yōu)缺點(diǎn),依賴注入,是IOC的一個(gè)方面,是個(gè)通常的概念,它有多種解釋,這概念是說(shuō)你不用創(chuàng)建對(duì)象,而只需要描述它如何被創(chuàng)建,需要的朋友可以參考下2023-07-07詳解spring applicationContext.xml 配置文件
本篇文章主要介紹了詳解spring applicationContext.xml 配置文件 ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02