可以说我上课了

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

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

    protected One one;
    protected Two two;

    //getters & setters
}

我想要一个可以扩展该类(class)的类(class)

,例如
@XmlType(propOrder = {
        "three"
    })

@XmlRootElement(name = "searchExtended")
public class SearchExtended extends Search {

    protected Three three;
    //getters & setters
}

您如何正确声明propOrder,我之前曾尝试过此方法,但未使用我认为会使用的命令。注释如何处理?/您应该如何在扩展类中声明这一点?

最佳答案

父项属性将根据其在子项属性之前的指定顺序进行整理。如果用propOrder注释父类,则可以将父类的属性包括在子类的@XmlTransient中。

  • http://blog.bdoughan.com/2012/08/jaxbs-xmltransient-and-property-order.html


  • 更新



    不,在类上设置@XmlTransient会将其从JAXB认为映射的类中删除。 JAXB在子类的属性之前取消父类(super class)的属性的原因是为了匹配XML模式的规则。如果您的Search类未使用@XmlTransient标记,则对应的XML模式如下。根据XML模式规则,为了使searchExtended类型的元素有效,来自 super 类型的元素必须出现在子类型中定义的任何元素之前。

      <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;
                }
    
            });
        }
    
    }
    

    10-07 17:10