java - 在扩展类上声明proporder

标签 java annotations jaxb

假设我有课

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

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

    protected One one;  
    protected Two two;

    //getters & setters
}

我想要一个扩展这个类的类

例如

@XmlType(propOrder = {
        "three"
    })

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

    protected Three three;  
    //getters & setters
}

如何正确声明 propOrder,我之前已经尝试过,但它没有使用我认为的顺序。注释是如何处理的?/你应该如何在扩展类中声明它?

最佳答案

父属性将根据其在子属性之前指定的顺序进行编码。如果您使用 @XmlTransient 注释父类,则可以在子类的 propOrder 中包含父类的属性。


更新

Is there a way i can make it transistant but still use it normally?

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

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

        });
    }

}

关于java - 在扩展类上声明proporder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12471674/

相关文章:

java - 注释 - 在构建时读取元素值

java - Dropwizard + Jersey : "Not inside a request scope" when creating custom annotation

java - 将对象编码为枚举类型时不调用 JAXB XmlJavaTypeAdapter

java - 使用 Exception Missing Envelope 标签的 Spring Web 服务模板

web-services - Java 网络服务不适用于 Jdk 6 和 Jboss 5.x

java - 从 BufferedReader 读取特定持续时间

java - Spring 3注解

java - 使用 itext : UnitValue cannot be cast to BorderRadius 将 html 转换为 pdf 期间 iText 7 异常

java - ini4j 在 .ini 文件中找不到现有 key

java - 用于配置测试的自定义注释