【问题标题】:JAXB XmlID and XmlIDREF annotations (Schema to Java)JAXB XmlID 和 XmlIDREF 注释(Java 架构)
【发布时间】:2010-10-01 04:15:16
【问题描述】:

我正在使用 CXF 公开一个 Web 服务。我正在使用 @XmlID 和 @XmlIDREF JAXB 注释在编组/解组期间维护我的对象图的引用完整性。

WSDL 正确地包含具有 xs:id 和 xs:idref 属性的元素来表示这一点。

在服务器端,一切运行良好。使用@XmlIDREF 注释的类型的实例与使用@XmlID 注释的实例是相同的实例(如==)。

但是,当我使用 WSDLToJava 生成客户端时,引用(那些使用 @XmlIDREF 注释的)是 java.lang.Object 类型的。

有什么方法可以自定义 JAXB 绑定,使引用的类型要么是 java.lang.String(以匹配被引用类型的 ID),要么与被引用类型本身相同?

【问题讨论】:

    标签: java wsdl jaxb jax-ws cxf


    【解决方案1】:

    使用内联 JAXB 绑定来指示要使用的类型。然后 JAXB 生成的代码将具有正确的类型。

    <complexType name="Column">
        <sequence>
            <element name="name" type="string" maxOccurs="1" minOccurs="1"></element>
            <element name="referencedColumn" type="IDREF" maxOccurs="1" minOccurs="0">
                <annotation>
                    <appinfo>
                        <jaxb:property>
                            <jaxb:baseType name="Column"/>
                        </jaxb:property>
                    </appinfo>
                </annotation> 
            </element>
        </sequence>
        <attribute name="id" type="ID" use="required"></attribute>
    </complexType>
    

    另请注意,您必须在 schema 元素中声明 jaxb 命名空间和 JAXB 版本。

    <schema targetNamespace="http://example.com/schema" 
        elementFormDefault="qualified" 
        xmlns="http://www.w3.org/2001/XMLSchema" 
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
        jaxb:version="1.0">
    

    【讨论】:

      【解决方案2】:

      好的,所以这行不通。 JAXB 不可能为 IDREF 生成具有正确类型的代码,因为架构无法指定引用的类型,并且可能有 IDREF 指向不同的复杂类型。 JAXB 如何知道引用的类型是什么? XML Schema 的扩展就可以了! :)

      【讨论】:

        【解决方案3】:

        以下似乎至少为 xs:IDREF 类型的元素/属性创建了字符串属性。一个好的开始,但理想情况下,JAXB 将生成与被引用元素相同类型的属性。如果/当我发现如何做到这一点时,我会报告。这个结果可能表明我需要编写自己的转换器,这将是一种耻辱。

        <jxb:bindings version="2.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
                <jxb:globalBindings>
                    <jxb:javaType name="java.lang.String" xmlType="xs:IDREF" parseMethod="javax.xml.bind.DatatypeConverter.parseString" printMethod="javax.xml.bind.DatatypeConverter.printString" />
                </jxb:globalBindings>
        </jxb:bindings>
        

        【讨论】:

          猜你喜欢
          • 2012-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-27
          • 2011-05-28
          • 1970-01-01
          • 2011-06-20
          • 2012-05-07
          相关资源
          最近更新 更多