[英]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.