You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Olingo4中从InputStream/String获取Edm?

在Olingo 4中从InputStream/String加载Edm的实现方法

你提到的这个点确实是Olingo 2和Olingo 4之间的一个差异——Olingo 4没有直接提供类似EntityProvider.readMetadata()的便捷方法,但我们可以借助它的底层CSDL解析API来实现需求。下面分两种场景给出具体实现:


一、从InputStream加载Edm

我们可以利用Olingo的CsdlParser解析元数据输入流,再通过ODataEdmProvider构建出Edm实例,代码示例如下:

import org.apache.olingo.client.api.ODataClient;
import org.apache.olingo.client.core.ODataClientFactory;
import org.apache.olingo.commons.api.edm.Edm;
import org.apache.olingo.commons.api.edm.provider.CsdlDocument;
import org.apache.olingo.commons.core.edm.provider.EdmProviderImpl;
import org.apache.olingo.commons.core.edm.provider.ODataEdmProvider;
import org.apache.olingo.commons.core.edm.xml.CsdlParser;

import java.io.InputStream;

public class EdmLoader {
    public static Edm loadEdmFromInputStream(InputStream metadataInputStream) throws Exception {
        // 1. 获取ODataClient实例
        ODataClient client = ODataClientFactory.getClient();
        
        // 2. 创建CSDL解析器
        CsdlParser parser = new CsdlParser(client.getServiceMetadata().getEdmEnabled());
        
        // 3. 解析输入流得到CSDL文档
        CsdlDocument csdlDocument = parser.parse(metadataInputStream);
        
        // 4. 构建EdmProvider并生成Edm
        ODataEdmProvider edmProvider = new EdmProviderImpl(csdlDocument);
        return client.getServiceMetadata().getEdm(edmProvider);
    }
}

关键说明:

  • CsdlParser是Olingo负责解析CSDL元数据的核心类,它能直接处理InputStream格式的元数据内容
  • ODataEdmProvider是Edm的提供者接口,我们用EdmProviderImpl包装解析后的CsdlDocument,再通过ODataClient的服务元数据来生成最终的Edm实例

二、从String加载Edm

如果你的元数据是String格式,只需要先把String转换成InputStream,再复用上面的方法即可;或者也可以直接用CsdlParser的parse(String)方法,示例如下:

import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;

public class EdmLoader {
    public static Edm loadEdmFromString(String metadataString) throws Exception {
        // 方式1:String转InputStream后复用上面的方法
        InputStream inputStream = new ByteArrayInputStream(metadataString.getBytes(StandardCharsets.UTF_8));
        return loadEdmFromInputStream(inputStream);
        
        // 方式2:直接用CsdlParser解析String
        /*
        ODataClient client = ODataClientFactory.getClient();
        CsdlParser parser = new CsdlParser(client.getServiceMetadata().getEdmEnabled());
        CsdlDocument csdlDocument = parser.parse(metadataString);
        ODataEdmProvider edmProvider = new EdmProviderImpl(csdlDocument);
        return client.getServiceMetadata().getEdm(edmProvider);
        */
    }
}

注意事项:

  • 确保元数据String的编码是UTF-8(OData元数据默认编码),避免解析时出现乱码问题
  • 两种方式效果一致,可根据自己的代码场景选择

内容的提问来源于stack exchange,提问作者Tintin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:13:43