有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

wsdl JAXB XmlID和XmlIDREF注释(从模式到Java)

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

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

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

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

是否有任何方法可以自定义JAXB绑定,以使引用类型为java或java。lang.String(与引用类型的ID匹配)还是与引用类型本身相同


共 (3) 个答案

  1. # 1 楼答案

    以下内容似乎至少为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>
    
  2. # 2 楼答案

    使用内联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">
    
  3. # 3 楼答案

    好吧,这是行不通的。JAXB不可能为IDREF生成具有正确类型的代码,因为模式无法指定引用的类型,并且可能有IDREF指向不同的复杂类型。JAXB如何知道引用的类型?XML模式的扩展可以做到这一点!:)