2013-04-24 72 views
2

我有一個XSD文件。使用xjc我從它生成類。 如何從生成的類中的XmlType註釋中更改propOrder值?只要我不是它的所有者,我不想更改XSD文件,也不想更改從此模式生成的類。有沒有辦法用自定義綁定文件(xjb)來實現這一點?問題是propOrder的價值對我來說是不可取的。作爲最後一個解決方案,我考慮對這個類使用parseMethod/printMethod,但這太棘手。JAXB物業訂單

我處理的FpML(XML鹼格式),這裏是一個XSD元素:

<xsd:complexType name="TradeIdentifier"> 
    <xsd:sequence> 
     <xsd:choice> 

      <xsd:sequence> 
       <xsd:element name="issuer" type="IssuerId"></xsd:element> 
       <xsd:element name="tradeId" type="TradeId"></xsd:element> 
      </xsd:sequence> 

      <xsd:sequence> 
       <xsd:group ref="PartyAndAccountReferences.model"> 
       </xsd:group> 
       <xsd:element name="reportingRole" type="ReportingRole" minOccurs="0"></xsd:element> 
       <xsd:choice maxOccurs="unbounded"> 
        <xsd:element name="tradeId" type="TradeId"></xsd:element> 
        <xsd:element name="versionedTradeId" type="VersionedTradeId"></xsd:element> 
       </xsd:choice> 
      </xsd:sequence> 

     </xsd:choice> 
    </xsd:sequence> 
</xsd:complexType> 

這裏是propOrder:

@XmlType(name = "TradeIdentifier", propOrder = { 
    "issuer", 
    "tradeId", 
    "partyReference", 
    "accountReference", 
    "reportingRole", 
    "tradeIdOrVersionedTradeId" 
}) 

當我在對象partyReference和tradeId,所設定的生成的xml是:

<partyTradeIdentifier> 
    <tradeId>NONREF</tradeId> 
    <partyReference href="Party2"/> 
</partyTradeIdentifier> 

XSD驗證失敗,錯誤代碼:

[org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'tradeId'. One of '{"http://www.nsd.ru/repository/fpml-5.4":issuer, "http://www.nsd.ru/repository/fpml-5.4":partyReference}' is expected.] 

解決方法是在tradeId之前放置partyReference元素。當我手動執行時,一切正常。但我不想手動更改生成的類,因爲在模式更改的情況下,我將不得不重複這種操作。這是一種下地獄。

我試着重命名一個tradeId,所以會有兩個字段。但是隻有一個tradeId字段被重命名,問題仍然存在。

+0

如果你改變了'propOrder '你將失去驗證XML模式的能力。目前的訂單如何不理想?您始終可以使用XSLT來控制輸出:http://blog.bdoughan.com/2012/11using-jaxb-with-xslt-to-produce-html.html – 2013-04-24 10:31:15

+0

對模式進行驗證的能力是我的試圖實現。 – Mikhail 2013-04-24 10:55:55

+1

看起來像這個bug https://java.net/jira/browse/JAXB-793。我還沒有找到任何解決方法。 – Mikhail 2013-04-24 11:57:07

回答

1

binding.xml

嘗試使用以下綁定文件生成從XML模式的類:

<?xml version="1.0" encoding="UTF-8"?> 
<bindings xmlns="http://java.sun.com/xml/ns/jaxb" xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    xsi:schemaLocation=" 
http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd" 
    version="2.1"> 
    <globalBindings> 
     <xjc:simple /> 
    </globalBindings> 
</bindings> 

XJC呼叫

xjc -extension -b binding.xml schema.xsd 
+1

這個工程!你在哪裏找到它?在「定製JAXB綁定」教程中我找不到有關的提及。 – Mikhail 2013-04-24 12:55:51

+0

@Noofiz - 你可以在http://jaxb.java.net上找到關於它的信息。我會提供具體的鏈接,但我認爲java.net目前正在維護中。 – 2013-04-24 14:03:38