使用JAXB无法读取XML的format属性问题求助
问题分析与解决方案
核心问题
你的代码错误地将format属性映射到了IssueDateTime类上,但在XML中,format是<udt:DateTimeString>元素的属性,而非<ram:IssueDateTime>的属性。同时,由于@XmlAccessorType(XmlAccessType.FIELD)的配置,直接在getter上添加注解会导致重复属性映射异常。
修复步骤
1. 创建DateTimeString类
需要单独创建一个类来表示<udt:DateTimeString>元素,同时捕获其文本值和format属性:
import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlValue; @XmlAccessorType(XmlAccessType.FIELD) public class DateTimeString { @XmlValue private String value; @XmlAttribute(name = "format") private String format; public String getValue() { return value; } public void setValue(String value) { this.value = value; } public String getFormat() { return format; } public void setFormat(String format) { this.format = format; } @Override public String toString() { return "DateTimeString{" + "value='" + value + '\'' + ", format='" + format + '\'' + '}'; } }
2. 修改IssueDateTime类
将原有的String dateTimeString字段替换为DateTimeString类型,并更新对应注解:
import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "IssueDateTime", namespace = NamespaceMapper.RAM_URI) @XmlAccessorType(XmlAccessType.FIELD) public class IssueDateTime { @XmlElement(name = "DateTimeString", namespace = NamespaceMapper.UDT_URI) private DateTimeString dateTimeString; public DateTimeString getDateTimeString() { return dateTimeString; } public void setDateTimeString(DateTimeString dateTimeString) { this.dateTimeString = dateTimeString; } @Override public String toString() { return "IssueDateTime{" + "dateTimeString=" + dateTimeString + '}'; } }
3. 保留原CrossIndustryInvoice类
无需修改该类,其配置已经正确对应XML结构。
解释
- 新的
DateTimeString类通过@XmlValue捕获<udt:DateTimeString>的文本内容,@XmlAttribute捕获format属性,完美匹配XML结构。 - 避免了原代码中属性映射位置错误的问题,同时解决了因
@XmlAccessorType配置导致的重复属性异常。
内容的提问来源于stack exchange,提问作者medi
相关产品推荐
相关产品推荐

