当前位置: 首页 > news >正文

Olingo分析和实践——整体架构流程

大纲

  • 整体架构流程
    • 1. OData框架核心组件初始化
    • 2. OData HTTP处理器配置
    • 3. 请求处理委托
  • 处理路径问题
  • 参考代码

在数据驱动的时代,如何高效、标准化地实现跨平台数据交互成为企业级应用开发的关键挑战。OData(Open Data Protocol) 作为一项由 OASIS 标准化的开放数据访问协议,应运而生。它基于 RESTful 架构风格,通过 HTTP 协议实现数据的查询、创建、更新和删除(CRUD)操作,支持 AtomPub 和 JSON 等多种数据格式,为不同系统、不同语言之间的数据交换提供了统一的 “语言”。无论是企业内部的服务集成,还是跨组织的数据源共享,OData 都凭借其标准化、可扩展的特性,大幅降低了数据交互的复杂度。​

而Apache Olingo则是 Apache 软件基金会旗下的开源项目,它为 OData 协议提供了强大的实现工具包,支持 OData 2.0 和 OData 4.0 两个主要版本。Olingo 不仅简化了 OData 服务的开发与部署流程,还提供了客户端库,方便开发者在各类应用中消费 OData 服务。无论是构建基于 OData 的后端服务,还是开发前端数据访问层,Olingo 都以其丰富的 API、灵活的扩展性和完善的文档支持,成为开发者实践 OData 协议的首选框架。​

本文将深入分析 Apache Olingo 的整体架构,并结合实践案例,剖析其核心组件的协作流程,为开发者理解和应用 Olingo 提供全面的参考。

整体架构流程

由于原生 Olingo 基于 Java EE Servlet 规范构建,而本文参考的例子是基于Springboot。由于 Spring Boot"约定优于配置" 的设计哲学与传统 Servlet 规范存在本质差异,导致在 Spring Boot 环境下封装 Olingo 时出现 REST 路径映射冲突。我们引入HttpServletRequestWrapper处理映射问题,然后将修正后的请求对象交由ODataSpringBootService处理(详见“处理路径问题”部分)。

其核心步骤如下:

1. OData框架核心组件初始化

OData odata = OData.newInstance();
ServiceMetadata serviceMetadata = odata.createServiceMetadata(new SpringBootEdmProvider(), new ArrayList<>()
);
  • OData实例创建:

    • OData.newInstance() 创建OData框架的入口点
    • 提供序列化、反序列化、URI解析等核心功能
  • 服务元数据构建:

    • SpringBootEdmProvider 定义实体数据模型(EDM)
    • 包含实体类型、属性、关系等结构信息
    • new ArrayList<>() 为空的引用列表,用于复杂场景下的元数据引用

元数据的重要性:

  • 定义OData服务的"API契约"
  • 客户端通过$metadata端点获取服务结构
  • 支持强类型的客户端代码生成

2. OData HTTP处理器配置

ODataHttpHandler handler = odata.createHandler(serviceMetadata);
handler.register(new SpringBootCarsProcessor(dataProvider));
  • 处理器创建:

    • 基于服务元数据创建HTTP请求处理器
    • 处理器负责请求路由和响应生成
  • 处理器注册:

    • SpringBootCarsProcessor 是自定义的业务逻辑处理器
    • 实现了多个处理器接口(EntityCollectionProcessor, EntityProcessor等)
    • 数据提供者注入,实现数据访问逻辑

架构意义:

  • 职责分离: HTTP处理与业务逻辑分离
  • 可扩展性: 可以注册多个不同类型的处理器
  • 类型安全: 通过接口约束确保处理器功能完整性

3. 请求处理委托

handler.process(request, response);

执行流程:

  1. 委托模式: 将HTTP请求委托给OData框架处理
  2. 自动路由: 框架根据URL路径自动选择合适的处理器方法
  3. 协议处理: 自动处理OData协议细节(查询选项、格式协商等)

处理能力:

  • 自动解析OData查询语法
  • 支持多种响应格式(JSON、XML)
  • 处理异常和错误响应

在这里插入图片描述

处理路径问题

这个问题的详细分析见《Spring Boot中处理Servlet路径映射问题》。
本文只给出处理方案——使用RequestWrapper修正Spring Boot和Olingo框架,核心就是重载getPathInfo方法,以让Olingo可以正确处理的PathInfo。

    /*** HttpServletRequest wrapper to provide correct path information for OData framework*/private static class HttpServletRequestWrapper extends jakarta.servlet.http.HttpServletRequestWrapper {public HttpServletRequestWrapper(HttpServletRequest request) {super(request);}@Overridepublic String getServletPath() {// Return the base service pathreturn "/cars.svc";}@Overridepublic String getPathInfo() {String requestUri = getRequestURI();String contextPath = getContextPath();// Remove context path and servlet path to get the path infoString basePath = contextPath + "/cars.svc";if (requestUri.startsWith(basePath)) {String pathInfo = requestUri.substring(basePath.length());if (pathInfo.isEmpty()) {return null; // This represents the service document request}return pathInfo; // This should be "/$metadata" for metadata requests}return null;}@Overridepublic String getRequestURI() {return super.getRequestURI();}@Overridepublic StringBuffer getRequestURL() {return super.getRequestURL();}}

参考代码

  • https://github.com/f304646673/odata/tree/main/java/Olingo-OData-5.0.0/samples/spring-boot-odata
http://www.dtcms.com/a/279278.html

相关文章:

  • idea下无法打开sceneBulider解决方法
  • JavaScript书写基础和基本数据类型
  • 关于僵尸进程
  • SwiftUI 全面介绍与使用指南
  • SSM框架学习——day1
  • 爬虫-爬取豆瓣top250
  • webrtc之子带分割下——SplittingFilter源码分析
  • vscode插件之markdown预览mermaid、markmap、markdown
  • 直播推流技术底层逻辑详解与私有化实现方案-以rmtp rtc hls为例-优雅草卓伊凡
  • 当 `conda list` 里出现两个 pip:一步步拆解并卸载冲突包
  • 2025年轨道交通与导航国际会议(ICRTN 2025)
  • 【数据同化案例1】ETKF求解参数-状态联合估计的同化系统(完整MATLAB实现)
  • C#结构体:值类型的设计艺术与实战指南
  • 2025年新能源与可持续发展国际会议(ICNESD 2025)
  • 非正常申请有这么多好处,为什么还要大力打击?
  • TreeSize Free - windows下硬盘空间管理工具
  • 一分钟K线实时数据数据接口,逐笔明细数据接口,分时成交量数据接口,实时五档委托单数据接口,历史逐笔明细数据接口,历史分时成交量数据接口
  • RESTful API 设计规范
  • 为什么资深C++开发者大部分选vector?揭秘背后的硬核性能真相!
  • Nginx配置信息
  • 项目进度图不直观,如何优化展示方式
  • 一种用于医学图像分割的使用了多尺寸注意力Transformer的混合模型: HyTransMA
  • SecretFlow 隐语 (2) --- 隐语架构概览
  • SQL性能调优经验总结
  • Redis缓存解决方案
  • Laravel 中 chunk 分页漏掉数据?深度解析原因与解决方案
  • 深度剖析:动态接口代理核心原理与高级应用
  • 工业4.0时代的安全管理:2025年物联网与AI技术的融合与10+工具实践
  • NSSCTF Web 一点学习
  • 高安全前端架构:Rust-WASM 黑盒技术揭秘