假设我有课
@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/