You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XmlMapper读取SOAP XML返回对象属性为null的问题排查与修复

修复Jackson XmlMapper映射SOAP XML时属性为null的问题

通过SOAP调用获取到固定格式的XML(无法修改响应内容),使用Jackson XmlMapper将其映射到自定义Java对象时,responseId等属性始终返回null,排查后确认是注解配置和类结构存在问题,以下是修复方案。

接收的原始XML

<soap:Envelope xmlns:soap="url">
    <soap:Body>
        <myResponse 
        xmlns="url2" 
        Id="responseId"/>
    </soap:Body>
</soap:Envelope>

现有代码的核心问题

  1. 类命名冲突:外部类MyResponse与内部Body类中的嵌套类同名,Jackson解析时出现混淆,无法正确绑定属性。
  2. 命名空间配置缺失:XML中元素带命名空间,但Java类未指定对应namespace注解,导致属性匹配失败。
  3. 默认实例干扰:类中直接初始化body = new Body()和myResponse = new MyResponse(),覆盖Jackson的自动映射逻辑。

修复后的Java对象定义

@Data
@JacksonXmlRootElement(localName = "Envelope", namespace = "url")
public class SoapEnvelope {
    @JacksonXmlProperty(localName = "Body", namespace = "url")
    private SoapBody body;

    @JacksonXmlProperty(localName = "soap", namespace = "http://www.w3.org/2000/xmlns/")
    private String soapEnv = "url";

    @Data
    public static class SoapBody {
        @JacksonXmlProperty(localName = "myResponse", namespace = "url2")
        private MyInnerResponse myResponse;
    }

    @Data
    public static class MyInnerResponse {
        @JacksonXmlProperty(localName = "xmlns", isAttribute = true)
        private String xmlns;

        @JacksonXmlProperty(localName = "Id", isAttribute = true)
        private String responseId;
    }
}

关键修改说明

  • 重命名类避免冲突:外部类改为SoapEnvelope,内部类改为SoapBody和MyInnerResponse。
  • 绑定命名空间:为每个元素添加namespace注解,匹配XML中的命名空间值。
  • 移除默认实例初始化:让Jackson自行创建对象并完成属性绑定。
  • 修正命名空间声明映射:使用XML标准命名空间http://www.w3.org/2000/xmlns/处理xmlns:soap属性。

修复后的XmlMapper配置及读取代码

var xmlMapper = new XmlMapper();
// 禁用空对象序列化失败
xmlMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
// 只序列化非空属性
xmlMapper.setDefaultPropertyInclusion(JsonInclude.Include.NON_NULL);
// 忽略未知属性
xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 启用根元素解析与命名空间支持
xmlMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
xmlMapper.setDefaultUseWrapper(false);

try {
    SoapEnvelope response = xmlMapper.readValue(xmlContent, SoapEnvelope.class);
    // 验证结果
    System.out.println("responseId: " + response.getBody().getMyInnerResponse().getResponseId());
    System.out.println("xmlns: " + response.getBody().getMyInnerResponse().getXmlns());
    return response;
} catch (JsonProcessingException e) {
    System.err.println("解析错误: " + e.getMessage());
    return null;
}

配置补充说明

  • UNWRAP_ROOT_VALUE:让Jackson正确识别带命名空间的根元素。
  • setDefaultUseWrapper(false):避免自动生成多余的包装器元素,匹配原始XML结构。

验证结果

修复后,Jackson可正确解析XML中的Id="responseId"和xmlns="url2"属性,responseId与xmlns字段将被正确赋值,不再返回null。

内容的提问来源于stack exchange,提问作者LiefLayer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 09:20:12