我正在使用CXF公开Web服务。我正在使用@XmlID和@XmlIDREF JAXB注释来在编组/解组时维护对象图的参照完整性。
WSDL正确地包含具有xs:id和xs:idref属性的元素来表示这一点。
在服务器端,一切都运行得很好。使用@XmlIDREF注释的类型实例与使用@XmlID注释注释的实例相同(<=)。
但是,当我使用WSDLToJava生成客户端时,引用(使用@XmlIDREF注释的引用)的类型为java.lang.Object。
有没有办法可以自定义JAXB绑定,以便引用类型是java.lang.String(匹配引用类型的ID)或者与引用类型本身相同?
答案 0 :(得分: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>
另请注意,您必须在jaxb
元素中声明schema
命名空间和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">
答案 1 :(得分:0)
以下似乎至少为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 :(得分:0)
好的,所以这不会起作用。 JAXB无法为IDREF生成具有正确类型的代码,因为架构无法指定引用类型,并且IDREF可能指向不同的复杂类型。 JAXB将如何知道引用的类型? XML Schema的扩展可以做到! :)