当前位置: 首页 > 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.lryc.cn/news/588113.html

相关文章:

  • 如何保护文件传输安全?文件传输加密
  • Mac下载mysql
  • 安装Keycloak并启动服务(macOS)
  • 概率论与数理统计(二)
  • 微信小程序——配置路径别名和省略后缀
  • 创客匠人:创始人 IP 打造的内核,藏在有效的精神成长里
  • 【第一章编辑器开发基础第一节绘制编辑器元素_6滑动条控件(6/7)】
  • 【PTA数据结构 | C语言版】字符串连接操作
  • Git安装避坑指南
  • 【Vue】Vue3.6 - Vapor 无虚拟DOM
  • 【第一章编辑器开发基础第二节编辑器布局_1水平与垂直布局(1/4)】
  • 计算两个经纬度之间的距离(JavaScript 实现)
  • 当 `conda list` 里出现两个 pip:一步步拆解并卸载冲突包
  • 详解BIO,NIO,AIO
  • Python Web框架对比:Flask vs FastAPI
  • Python数据容器-字典dict
  • 丑团-h5-Mtgsig算法-分析
  • Linux基础开发工具(3)
  • ACL流量控制实验
  • 车载诊断框架 --- 车载诊断GuideLine
  • 信息收集的骚打法
  • 安装llama-factory报错 error: subprocess-exited-with-error
  • SQL创建三个表
  • 国产LVDT信号调理芯片XJD698对比AD698的技术突破与优势解析
  • 代码随想录算法训练营第三十五天|416. 分割等和子集
  • CLIP、Open CLIP、SigLip、SigLip2的相关总结
  • 内网环境自签名超长期HTTPS证书,并在Chrome中显示为安全证书
  • Faiss能解决什么问题?Faiss是什么?
  • 【数据结构初阶】--单链表(二)
  • Kafka Broker源码解析(上篇):存储引擎与网络层设计