2013-01-03 111 views
3

,這些類發生故障。 @xmlElementRef與required =「false」一起使用,並且該屬性不被允許。 我的.xsd我使用:從xsd文件生成一些類後,JAXB生成錯誤類

<xs:schema xmlns:ns="http://shop.pau.softm.com/xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified" 
targetNamespace="http://shop.pau.softm.com/xsd"> 
    <xs:element name="checkOrder"> 
    <xs:complexType> 
    <xs:sequence> 
      <xs:element minOccurs="0" name="order" nillable="true" type="ns:Order"/> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:complexType name="Order"> 
    <xs:sequence> 
    <xs:element minOccurs="0" name="addressNumber" type="xs:int"/> 
    <xs:element minOccurs="0" name="auftragsNummer" type="xs:int"/> 
    <xs:element minOccurs="0" name="companyNumber" nillable="true" type="xs:string"/> 
    <xs:element maxOccurs="unbounded" minOccurs="0" name="condition" nillable="true" type="ns:Condition"/> 
    <xs:element minOccurs="0" name="currency" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="customerId" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="customerReference" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="deliveryAddress" nillable="true" type="ns:Address"/> 
    <xs:element minOccurs="0" name="deliveryConditions" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="deliveryType" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="endCustomerId" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="endCustomerReference" nillable="true" type="xs:string"/> 
    <xs:element maxOccurs="unbounded" minOccurs="0" name="error" nillable="true" type="ns:Error"/> 
    <xs:element minOccurs="0" name="haltDescription" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="haltFlag" type="xs:boolean"/> 
    <xs:element minOccurs="0" name="keySalesArea" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="openingHours" nillable="true" type="xs:string"/> 
    <xs:element maxOccurs="unbounded" minOccurs="0" name="orderItem" nillable="true" type="ns:OrderItem"/> 
    <xs:element minOccurs="0" name="origin" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="tourNumber" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="type" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="warehouseMan" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="warehouseNumber" type="xs:int"/> 
    <xs:element minOccurs="0" name="wishedDeliveryDate" nillable="true" type="xs:string"/> 
    </xs:sequence> 
</xs:complexType> 
<xs:complexType name="Condition"> 
    <xs:sequence> 
    <xs:element minOccurs="0" name="description" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="type" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="value" nillable="true" type="xs:decimal"/> 
    </xs:sequence> 
</xs:complexType> 
<xs:complexType name="Address"> 
<xs:sequence> 
    <xs:element minOccurs="0" name="city" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="country" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="createAddress" type="xs:boolean"/> 
    <xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="name2" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="name3" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="name4" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="street" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="zip" nillable="true" type="xs:string"/> 
    </xs:sequence> 
</xs:complexType> 
<xs:complexType name="Error"> 
<xs:sequence> 
    <xs:element minOccurs="0" name="code" type="xs:int"/> 
    <xs:element minOccurs="0" name="message" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="origin" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="type" nillable="true" type="xs:string"/> 
    </xs:sequence> 
</xs:complexType> 
<xs:complexType name="OrderItem"> 
    <xs:sequence> 
    <xs:element minOccurs="0" name="additionalText" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="additionalText2" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="customerProductId" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="eanCodeOrderUnit" nillable="true" type="xs:string"/> 
    <xs:element maxOccurs="unbounded" minOccurs="0" name="error" nillable="true" type="ns:Error"/> 
    <xs:element minOccurs="0" name="haltDescriptionItem" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="price" nillable="true" type="xs:decimal"/> 
    <xs:element minOccurs="0" name="productId" nillable="true" type="xs:string"/> 
    <xs:element minOccurs="0" name="quantity" type="xs:double"/> 
    </xs:sequence> 
</xs:complexType> 
<xs:element name="checkOrderResponse"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element minOccurs="0" name="return" nillable="true" type="ns:Order"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
<xs:element name="submitOrder"> 
<xs:complexType> 
<xs:sequence> 
     <xs:element minOccurs="0" name="order" nillable="true" type="ns:Order"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
<xs:element name="submitOrderResponse"> 
<xs:complexType> 
<xs:sequence> 
     <xs:element minOccurs="0" name="return" nillable="true" type="ns:Order"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
</xs:schema> 

和結果(部分)

package com.softm.pau.shop.xsd; 
import javax.xml.bind.JAXBElement; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElementRef; 
import javax.xml.bind.annotation.XmlType; 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Address", propOrder = { 
    "city", 
    "country", 
    "createAddress", 
    "name", 
    "name2", 
    "name3", 
    "name4", 
    "street", 
    "zip" 
}) 
public class Address { 

@XmlElementRef(name = "city", namespace = "http://shop.pau.softm.com/xsd", type = JAXBElement.class, required = false) 
protected JAXBElement<Object> city; 
@XmlElementRef(name = "country", namespace = "http://shop.pau.softm.com/xsd", type = JAXBElement.class, required = false) 
protected JAXBElement<Object> country; 
protected Object createAddress; 
@XmlElementRef(name = "name", namespace = "http://shop.pau.softm.com/xsd", type = JAXBElement.class, required = false) 
protected JAXBElement<Object> name; 
@XmlElementRef(name = "name2", namespace = "http://shop.pau.softm.com/xsd", type = JAXBElement.class, required = false) 
protected JAXBElement<Object> name2; 
@XmlElementRef(name = "name3", namespace = "http://shop.pau.softm.com/xsd", type = JAXBElement.class, required = false) 
protected JAXBElement<Object> name3; 
@XmlElementRef(name = "name4", namespace = "http://shop.pau.softm.com/xsd", type = JAXBElement.class, required = false) 
protected JAXBElement<Object> name4; 
@XmlElementRef(name = "street", namespace = "http://shop.pau.softm.com/xsd", type = JAXBElement.class, required = false) 
protected JAXBElement<Object> street; 
@XmlElementRef(name = "zip", namespace = "http://shop.pau.softm.com/xsd", type = JAXBElement.class, required = false) 
protected JAXBElement<Object> zip; 

?我怎樣才能XmlElement的,而不是XmlElementRef將?我必須在xsd中更改哪些內容? xsd是wsdl的摘錄,我想使用生成的類來調用 webservice。

齊格弗裏德

OK,有些鐵道部的相關信息在這裏,不能回答我的問題...

我與STS和工作的Java6。在我的build.xml編碼

<!-- JAXB--> 
<taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask"> 
    <classpath> 
     <fileset dir="lib/ct" includes="*.jar" /> 
    </classpath> 
</taskdef> 

<target name="gen.java" description="Generates the JAXB business objects"> 
    <xjc destdir="src/gen" extension="true"> 
     <schema dir="conf/webapp/WEB-INF/schema" includes="*.xsd" /> 
     <binding dir="resources" includes="*.xjb" /> 
    </xjc> 
</target> 

我binding.xjb看起來像

<jxb:bindings version="1.0" 
xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
xmlns:s="http://www.w3.org/2001/XMLSchema" 
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
jxb:extensionBindingPrefixes="xjc"> 

<jxb:bindings schemaLocation="../conf/webapp/WEB-INF/schema/wsinapa.xsd" node="/s:schema"> 
    <jxb:bindings node="/s:schema/s:element[@name='AccountStatus']"> 
     <jxb:class name="AccountStatusRequest"/> 
    </jxb:bindings> 
</jxb:bindings> 

在src目錄

是2的.xsd應該編譯。其中一個編譯時沒有 錯誤,其他沒有。兩者都從wsdl文件中提取。

歡呼

齊格弗裏德

回答

10

JAXB (JSR-222)實現不產生錯誤的類。 required屬性已添加到JAXB 2.2中的@XmlElementRef註釋中。

最有可能你已經生成Java SE 7中(包括JAXB 2.2)JAXB類,並試圖在Java SE 6中(包括JAXB 2.1),然後運行。使用JAXB 2.2實現,您可以使用-target標誌創建JAXB 2.1(或JAXB 2.0)兼容代碼。

xjc -target 2.1 schema.xsd 
+0

請看看我更新的問題。 –

3

我覺得它在xsd中沒什麼改變。嘗試創建一個綁定文件,如simple-binding.xjb。

<jaxb:bindings version="2.1" 
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <jaxb:globalBindings generateElementProperty="false"/> 
</jaxb:bindings> 

然後在從xsd生成java類時使用此命令。我想你是wsimport,伴隨着jdk來生成源代碼。

wsimport -b simple-binding.xjb 

所以,如果你正在使用the maven-jaxb2-plugin運行XJC你不會得到標籤XmlElementRef

+0

我正在使用STS和Java6。在build.xml中編碼爲 –

+0

然後更新xjc參數,如下所示:xjc -b simple-binding.xjb –

+0

請查看我更新的問題 –

0

,你可能會碰到同樣的問題。我通過將<specVersion>2.1加到我的pom.xml來修復它。如下:

<plugin> 
    <groupId>org.jvnet.jaxb2.maven2</groupId> 
    <artifactId>maven-jaxb2-plugin</artifactId> 
    <executions> 
    <execution> 
     ... 
     <configuration> 
     ... 
     <specVersion>2.1</specVersion> 
     ... 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
+0

謝謝,爲我解決了這個問題 - 不知道爲什麼這是downvoted。 – Neil