如何在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
相关产品推荐
相关产品推荐

