2012-09-18 110 views
6

可以說我有類聲明proporder在擴展級

@XmlType(propOrder = { 
     "one", 
     "two" 
    }) 

@XmlRootElement(name = "search") 
public class Search { 

    protected One one; 
    protected Two two; 

    //getters & setters 
} 

,我想擴展此類

例如一類

你如何正確申報propOrder,我已經嘗試過這一點,它沒有使用我認爲它會順序。這是如何通過註釋處理的? /你應該如何在擴展類中聲明這個?

+0

哪些是需要的順序和outcoming一個? – Gabber

回答

8

父項屬性將根據它們在子屬性之前的指定順序進行編組。如果使用@XmlTransient註釋父類,則可以在子類的propOrder中包含父類中的屬性。


UPDATE

有沒有一種辦法可以讓它transistant但仍可正常使用呢?

否,在類上設置@XmlTransient會將其從JAXB認爲映射的類中移除。 JAXB在子類的屬性匹配XML模式的規則之前綁定超類的屬性的原因。當您的Search類沒有標記@XmlTransient時,相應的XML模式如下所示。根據XML模式規則,爲了使searchExtended類型的元素有效,來自超類型的元素必須出現在子類型中定義的任何元素之前。

<xs:complexType name="searchExtended"> 
    <xs:complexContent> 
     <xs:extension base="search"> 
     <xs:sequence> 
      <xs:element name="three" type="three" minOccurs="0"/> 
     </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 

    <xs:complexType name="search"> 
    <xs:sequence> 
     <xs:element name="one" type="one" minOccurs="0"/> 
     <xs:element name="two" type="two" minOccurs="0"/> 
    </xs:sequence> 
    </xs:complexType> 

你可以看到對應於通過運行下面的代碼你JAXB模型中的XML模式:

import java.io.IOException; 
import javax.xml.bind.*; 
import javax.xml.transform.Result; 
import javax.xml.transform.stream.StreamResult; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(SearchExtended.class); 
     jc.generateSchema(new SchemaOutputResolver() { 

      @Override 
      public Result createOutput(String namespaceUri, 
        String suggestedFileName) throws IOException { 
       StreamResult result = new StreamResult(System.out); 
       result.setSystemId(suggestedFileName); 
       return result; 
      } 

     }); 
    } 

} 
+0

感謝您的回覆,這是我在擴展課程之後所做的。但是現在基類是不可用的,並且需要一個擴展類來使用基本屬性,我做了一個粘貼箱來顯示我的結構http://pastebin.com/fDTb1q5A,有沒有一種方法可以使它具有反轉性,但仍然可以使用它通常。 –

+0

也我的意思是瞬態不轉導:) –

+1

非常感謝您的更新答案,非常幫助我。我很欣賞這種努力。 –