[英]JAXB not mapping an attribute into a “custom” class
我從xml模式生成Java類,對於一種復雜的類型,我希望jaxb使用現有的類,為此我有一個外部綁定定制文件。 除了類型的單個屬性外 ,該自定義類已正確解組,該類型的屬性從未在Java類中填充。
以下是Thing類型/類問題的演示。
模式中定義的事物為:
<xsd:complexType name="Thing">
<xsd:sequence>
<xsd:element name="nameEl" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="nameAttr" type="xsd:string" use="required"/>
</xsd:complexType>
讀取匹配的xml文件的代碼段是:
JAXBContext jc = JAXBContext.newInstance("jaxbtest");
Unmarshaller u = jc.createUnmarshaller();
// Make it validate against the instance schema
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new File("./sample.xsd"));
u.setSchema(schema);
Config config = (Config)u.unmarshal(new File("./sample.xml"));
for (Thing thing : config.getThing()) {
System.out.println("nameAttr=[" + thing.getNameAttr() +"]");
System.out.println("nameEl=[" + thing.getNameEl() +"]");
}
在此xml中閱讀:
<m:config xmlns:m="test">
<thing nameAttr="hello">
<nameEl>goodbye</nameEl>
</thing>
</m:config>
使用JAXB生成的Thing類(不使用自定義項xjb),輸出是預期的:
nameAttr=[hello]
nameEl=[goodbye]
使用僅具有nameAttr和nameEl的getter和setter的自定義Thing類,輸出為
nameAttr=[null]
nameEl=[goodbye]
自定義類很簡單:
public class Thing {
private String nameEl;
private String nameAttr;
public String getNameEl() {
return nameEl;
}
public void setNameEl(String value) {
this.nameEl = value;
}
public String getNameAttr() {
return nameAttr;
}
public void setNameAttr(String value) {
this.nameAttr = value;
}
}
誰能解釋為什么“ nameEL”元素和“ nameAttr”屬性的行為不同?
將定制的Thing與生成的JAXB進行比較Thing唯一的區別是注釋,當我不從Java類生成模式時,我認為這是沒有必要的,顯然對於包含的元素也沒有必要。
為了完整起見,xjb為:
<jxb:bindings
version="2.1"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb">
<jxb:bindings schemaLocation="sample.xsd">
<jxb:bindings node="//xsd:complexType[@name='Thing']">
<jxb:package name=""/>
<jxb:class ref="custom.Thing"/>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
嗯,您實際上應該在屬性而不是元素中為null
。
我的猜測是問題很簡單。 注釋很重要:如果不提供注釋,則默認情況下@XmlElement
屬性視為@XmlElement
注釋。 這就是為什么一個屬性沒有編組而另一個屬性沒有編組的原因。
但是,如前所述,您實際上應該為該屬性而不是該元素獲取null
。 您能再檢查一下嗎?
這是Blaise的相關文章 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.