【问题标题】:JAXB annotations to deal with same element name in different namespaces处理不同命名空间中相同元素名称的 JAXB 注释
【发布时间】:2010-10-29 22:49:29
【问题描述】:

我要解决的问题是 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 自定义。好吧,这将是很多工作。

【问题讨论】:

  • 您的问题不清楚。主题中玩具所指的“元素名称”是什么?真正的问题是什么?

标签: java annotations jaxb xml-namespaces


【解决方案1】:

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

@jamh

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

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

【讨论】:

    【解决方案2】:

    在元素声明中你需要提供不同的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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-17
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多