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

如何使用Spring与Jaxb2读取SOAP响应中的多个结果?

解决Spring SOAP调用中多User响应的解析问题

看起来你遇到的核心问题是JAXB注解映射和SOAP响应结构不匹配,导致无法正确解析多个User节点。咱们一步步来修正这个问题:

问题根源分析

你的SOAP响应结构是:

<UserResponse xmlns="...">
  <Users>
    <User>...</User>
    <User>...</User>
  </Users>
</UserResponse>

这里<Users>是一个包装节点,里面包含多个<User>子节点。而你原来的实体类直接把@XmlElement(name="Users")标注在单个User对象上,后来改成List<User>但没调整注解逻辑,自然无法正确映射。

修正后的实体类代码

你需要用@XmlElementWrapper和@XmlElement组合来处理这种"包装节点+多个子节点"的结构,同时注意命名空间和内部类的静态化(避免序列化问题):

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {"users"})
@XmlRootElement(name = "UserResponse", namespace = "这里替换成响应里的xmlns值")
public class Users {
    // 用@XmlElementWrapper映射外层的<Users>包装节点
    @XmlElementWrapper(name = "Users", namespace = "这里替换成响应里的xmlns值")
    // 用@XmlElement映射包装节点内的每个<User>子节点
    @XmlElement(name = "User", namespace = "这里替换成响应里的xmlns值")
    protected List<User> users;

    // GETTER/SETTER,建议初始化空List避免空指针
    public List<User> getUsers() {
        if (users == null) {
            users = new ArrayList<>();
        }
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }

    // 内部User类改为static,避免JAXB序列化时持有外部类引用的问题
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "User", propOrder = {"name", "surname"})
    public static class User {
        @XmlElement(name = "NAME", namespace = "这里替换成响应里的xmlns值")
        protected String name;
        @XmlElement(name = "SURNAME", namespace = "这里替换成响应里的xmlns值")
        protected String surname;

        // GETTER/SETTER
        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getSurname() {
            return surname;
        }

        public void setSurname(String surname) {
            this.surname = surname;
        }
    }
}

关键注解说明

  1. @XmlElementWrapper(name="Users"):专门用来映射包裹子节点的父容器(也就是响应里的<Users>),它会告诉JAXB:这个List的所有元素都要放在这个包装节点里面。
  2. @XmlElement(name="User"):指定List中的每个元素对应响应里的<User>子节点。
  3. 命名空间:一定要确保所有注解的namespace属性和SOAP响应里的xmlns值完全一致,否则JAXB会因为节点命名空间不匹配而忽略这些元素。
  4. 静态内部类:非静态内部类会持有外部类的引用,在JAXB序列化/反序列化时容易引发异常,改成static内部类可以避免这个问题。

后续测试建议

修改完成后,你可以在调用WebService的代码中,获取解析后的Users对象,通过getUsers()方法就能拿到所有的User数据了。如果还是有问题,可以先打印一下原始的SOAP响应内容,确认命名空间是否正确,或者用JAXB的Unmarshaller单独做一个小测试,验证解析逻辑是否正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 01:32:29