JAXB注释在不同的命名空间中处理相同的元素名称

时间:2010-10-29 22:49:29

标签: java annotations jaxb xml-namespaces

我试图解决的问题是JAXB无法处理不同命名空间中同名的父对象和继承对象。

我有两个模式:

schemaA.xsd

<xs:schema xmlns:A="...">
<xs:complexType name="mytype">
...

schemaB.xsd

<xs:schema xmlns:B="..." xmlns:A="...">
<xs:import namespace="..." schemaLocation="schemaA.xsd"/>
<xs:complexType name="mytype">
...

此处mytype定义在 schemaB 中有所不同。不,我无法控制架构,它们是大型商业第三方提供的。人们如何处理这种情况?关键是 schemaB 引用 schemaA ,并确实使用了 schemaA 中的许多元素。 JAXB无法单独在B上运行,但它可以单独在A上运行。

最后一点,涉及许多元素,无法为所有这些元素添加JAXB自定义。那将是很多工作。

2 个答案:

答案 0 :(得分:0)

有趣的是,JAXB的问题几乎没有任何回应。

@jamh

我假设您正在尝试运行xjc来为第三方架构生成Java存根。您是否尝试为每个命名空间指定不同的包名?这可以在自定义绑定文件中完成,也可以在命令行中使用-p参数...

完成

xjc -p com.your.package.name / path / to / xsd

答案 1 :(得分:0)

在元素声明中,您需要提供不同的propertyName:

<xs:element ref="namespace1:foo">
    <xs:annotation>
        <xs:appinfo>
            <jaxb:property name="fooElement"/> // here you see changing the name
        </xs:appinfo>
    </xs:annotation>
</xs:element>

如果你有两个名为“foo”的元素,并且其中一个元素有一个声明,当其中一个元素没有时,就这样做。

您将生成(通过xjc)具有属性的对象:

Foo foo;
Foo fooElement;

所以不会有冲突。

您可以在http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.5/tutorial/doc/JAXBUsing4.html

上阅读有关绑定的更多信息