@XmlValue用于映射XML元素的纯文本内容,须与@XmlAttribute配合处理带属性的简单元素,且一个类中只能有一个@XmlValue字段,不能用于含子元素或多个文本字段的场景。
@XmlValue 用于将 Java 字段或属性映射为 XML 元素的**文本内容(simple content)**,即该元素**没有子元素,只有纯文本值**。它不能和 @XmlElement、@XmlAttribute 等同时作用于同一个字段(会报错),且只能用于单个字段。
当 XML 元素既有文本内容,又有属性时,@XmlValue 配合 @XmlAttribute 是标准解法。例如:
对应 Java 类写法:
public class Price {
@XmlAttribute
public String currency;
@XmlValue
public BigDecimal value;
}
注意:@XmlValue 字段必须是**唯一的
内容承载字段**,且类型需支持 JAXB 序列化(如 String、int、BigDecimal 等)。
以下情况 @XmlValue 不适用:
John Doe )→ 应用 @XmlElement 嵌套对象@XmlValue → 编译/运行时报错“more than one @XmlValue”XmlAdapter
若字段为 private,需确保 JAXB 能访问到它。推荐显式设置访问器:
@XmlAccessorType(XmlAccessType.FIELD)
public class Price {
@XmlAttribute
private String currency;
@XmlValue
private BigDecimal value;
}
也可用 XmlAccessType.PROPERTY,此时需在 getter 上标注 @XmlValue:
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Price {
private String currency;
private BigDecimal value;
@XmlAttribute
public String getCurrency() { return currency; }
public void setCurrency(String currency) { this.currency = currency; }
@XmlValue
public BigDecimal getValue() { return value; }
public void setValue(BigDecimal value) { this.value = value; }
}
String,JAXB 会原样序列化/反序列化,空格和换行会被保留(除非 XML 中用了 xml:space="preserve")),@XmlValue 字段会设为 null(对基本类型会抛异常,建议用包装类)@XmlSchema 或 package-info.java