2012-09-18 71 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

非常感谢您的更新答案,非常帮助我。我很欣赏这种努力。 –