嵌套元素列表的JAXB注释
我有以下XML:
asdas d123asdsad 0 23123s qwerty
我有以下java类来映射它:
@XmlRootElement(name = "mappings") public class Mappings { @XmlElement(name = "mapping") private List mMappings; public List getMappings() { return mMappings; } public void setMappings(List aMappings) { this.mMappings = aMappings; } } public class Mapping { @XmlElement(name = "parameter") private List mParameters; public List getParameters() { return mParameters; } public void setParameters(List aParameters) { this.mParameters = aParameters; } } public class Parameter { @XmlAttribute(name = "attr") private String mName; @XmlValue private String mValue; public String getName() { return mName; } public void setName(String aName) { this.mName = aName; } public String getValue() { return mValue; } public void setValue(String aValue) { this.mValue = aValue; } }
当我试图解开它时
JAXBContext context = JAXBContext.newInstance(BundleMappings.class); Unmarshaller um = context.createUnmarshaller(); mappings = (BundleMappings)um.unmarshal(new File(myFile));
我收到这个错误
If a class has @XmlElement property, it cannot have @XmlValue property.
我需要参数既有’attr’属性又有内容,所以我做错了什么?
默认情况下, JAXB(JSR-222)实现将公共属性(get / set方法)和带注释的字段视为映射(和单独)。 默认映射是@XmlElement
因此您的属性将被视为以这种方式映射。
解决方案#1
由于您要注释字段,因此需要在类上添加@XmlAccessorType(XmlAccessType.FIELD)
。
@XmlAccessorType(XmlAccessType.FIELD) public class Parameter { @XmlAttribute(name = "attr") private String mName; @XmlValue private String mValue; public String getName() { return mName; } public void setName(String aName) { this.mName = aName; } public String getValue() { return mValue; } public void setValue(String aValue) { this.mValue = aValue; } }
解决方案#2
注释get(或set)方法。
public class Parameter { private String mName; private String mValue; @XmlAttribute(name = "attr") public String getName() { return mName; } public void setName(String aName) { this.mName = aName; } @XmlValue public String getValue() { return mValue; } public void setValue(String aValue) { this.mValue = aValue; } }
了解更多信息
- http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html
- http://blog.bdoughan.com/2011/06/jaxb-and-complex-types-with-simple.html
UPDATE
您还需要在mappings
属性上使用@XmlElenent
注释来指定应该mapping
的元素名称。
@XmlRootElement(name = "mappings") public class Mappings { private List mMappings; @XmlElement(name="mapping") public List getMappings() { return mMappings; } public void setMappings(List aMappings) { this.mMappings = aMappings; } }