JAXB unmarshalling解析XML返回Saccreq空列表问题求解
故障根因
你的JAXB注解配置本身没有错误,解析返回空列表的核心原因是传入的XML字符串存在实体转义问题:<MT94x>标签包裹的所有内层标签都被转义成了HTML实体格式——所有左尖括号<被替换为<,右尖括号>被替换为>。
JAXB解析时会把这部分转义后的内容识别为<MT94x>节点下的纯文本内容,而非结构化的<saccreq>子节点,自然无法完成子节点到List<Saccreq>字段的映射,最终返回空列表。
修复方法
- 优先选择:在执行JAXB反序列化前,先对原始XML字符串做一次XML实体反转义,把转义字符还原为正常的XML标签,再传入解析逻辑即可。
简单场景可以直接用字符串替换实现:
如果数据中可能存在public static void main(String[] args) { String data = "<MT94x><saccreq><id>979373531_410</id><code>1</code><state>BEGIN</state></saccreq>......</MT94x>"; // 新增:反转义XML实体 String validXml = data.replace("<", "<").replace(">", ">"); MT94x result = stringToObject(validXml, MT94x.class); System.out.println(result.getSaccreq()); }&、"等其他XML转义实体,建议用标准XML反转义工具处理(比如Apache Commons Text提供的StringEscapeUtils.unescapeXml()方法),避免手动替换遗漏场景。 - 适配特殊业务场景:如果上游接口的设计就是将内层saccreq内容作为转义字符串存在MT94x节点下,你需要调整映射逻辑:先给MT94x类配置
@XmlValue字段读取MT94x节点下的纯文本内容,再对拿到的文本内容单独做一次JAXB反序列化,转换为Saccreq列表即可。
补充校验项
如果完成上述修改后仍解析失败,可以在创建JAXBContext时显式传入所有关联类,避免类扫描遗漏:
final JAXBContext jaxbContext = JAXBContext.newInstance(clazz, Saccreq.class);
内容的提问来源于stack exchange,提问作者Kinzheyev Madi
相关产品推荐
相关产品推荐

