嵌套元素列表的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; } } 

了解更多信息


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