gpt4 book ai didi

java - SDO API : how to make XSDHelper. 实例是否正确定义带有 的 XSD 架构?

转载 作者:行者123 更新时间:2023-11-30 06:08:27 26 4
gpt4 key购买 nike

我面临以下问题。我们使用服务数据对象,因为我们的目标运行时是 IBM WebSphere,它应该是该 API 的原生运行时。我们使用的堆栈是 Java EE、Eclipse Oxygen 作为主要 IDE、根据 SDO 2.1.0 规范的 SDO 引用实现、IBM WebSphere 9 和 JRE8。

根据 SDO javadoc 有一个 define(java.io.InputStream xsdInputStream, java.lang.String schemaLocation) XSDHelper下的方法类,它将所需的 XSD 模式加载到 WAS 运行时中。加载模式后,其类型即可用于其他操作,包括 DataObject创建..我定义架构的方式如下所示:

InputStream is = new BOStorage().getInputStreamXSD("/test.xsd"); 
XSDHelper.INSTANCE.define(is, null);

define()方法从 EJB 构造函数调用。 test.xsd位于我的 Eclipse 项目的 src 文件夹下。

src
| test.xsd
| test1.xsd
|
|___ejb.package.name

现在了解一下 test.xsd 本身。它引用了相同的另一个 XSD targetNamespace使用<include>标签:

test.xsd 片段:

...
<xsd:schema
targetNamespace="http://ejb/package/name"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:bons0="http://ejb/package/name">
<xsd:include schemaLocation="test1.xsd"></xsd:include>
<xsd:include schemaLocation="test2.xsd"></xsd:include>
<xsd:complexType name="TestSDO">
...
<xsd:element minOccurs="0" name="RefObject"
type="bons0:RefObject">
</xsd:element>
...

test1.xsd包含 complexType命名RefObject ,在 test.xsd 中引用.

test1.xsd 片段:

...
<xsd:complexType name="RefObject">

<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="type"/>
</xsd:extension>
</xsd:simpleContent>

</xsd:complexType>
...

正如版本 2.1.0 的官方 SDO Java 规范所说:

9.7 XSD Mapping Details

...

  1. All <group> references, <attributeGroup> references, <include>s, and <import>s are fully expanded to the equivalent XSD as if these declarations were not present.

...

对于我的愿景来说,这意味着在我的例子中,SDO 实现应该:

  1. 加载test.xsd;

  2. 发现它引用了 test1.xsd在其 <include>部分;

  3. 作为 test1.xsd位于同一src文件夹,如test.xsd是的,我的期望是它将隐式加载到 WebSphere 运行时环境中。

但是我在尝试创建 RefObject 的 DataObject 时遇到错误类型:

CWSDO0001E: Cannot create a data object of the type {http://ejb/package/name}RefObject because the type cannot be found

我可以得出的结论是,SDO API 并非设计为以这种方式工作,或者我的 XSD 或任何不适合或包含一些错误。

任何帮助将不胜感激。

更新:在使用“全局”XSD(包括所有内联引用)的情况下,它的工作方式与预期一样。我之前提到的所有内容都是从无状态 EJB bean 运行的。

导致错误的示例代码:

        @Stateless(mappedName = "TestSDO")
@Remote(TestSDORemote.class)
@Local(TestSDOLocal.class)

public class TestSDO implements TestSDORemote, TestSDOLocal{
...


// default EJB constructor

public TestSDO() {
String textInfo = "";

try {
defineSDOTypes();
} catch (Exception e) {
LOGGER.log(Level.WARNING, "Could not define SDO types");
}
}
...
private void defineSDOTypes() {
HelperContext hc =
SDO.getHelperContextFactory().createHelperContext("ScopeManagerTestID",
null);
XSDHelper xsdHelper = hc.getXSDHelper();
try (InputStream is = new BOStorage().getInputStreamXSD("/test.xsd")) {
xsdHelper.define(is, null);
} catch (IOException e) {
LOGGER.logp(Level.WARNING, CLASS_NAME, METHOD_NAME, "Unable to load the
schema: " +
"test.xsd" + ": " + e.getMessage());
e.printStackTrace();
}
...
// creates the target Data Object (here comes the error)
private void createBO(){
DataObject dob = DataFactory.INSTANCE.create("http://ejb/package/name",
"RefObject");
}
...

最佳答案

看看 Tuscany SDO repo ,你似乎想做类似的事情:

    URL url = getClass().getResource("/test.xsd");
InputStream inputStream = url.openStream();
xsdHelper.define(inputStream, url.toString());
inputStream.close();

也就是说,我认为您需要传入第二个参数的值:schemaLocation 作为 javadoc,而不是执行 xsdHelper.define(is, null)建议:

schemaLocation - the URI of the location of the schema, used for processing relative imports and includes. May be null if not used.

关于java - SDO API : how to make XSDHelper. 实例是否正确定义带有 <include> 的 XSD 架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50772531/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com