如何使用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; } } }
关键注解说明
@XmlElementWrapper(name="Users"):专门用来映射包裹子节点的父容器(也就是响应里的<Users>),它会告诉JAXB:这个List的所有元素都要放在这个包装节点里面。@XmlElement(name="User"):指定List中的每个元素对应响应里的<User>子节点。- 命名空间:一定要确保所有注解的
namespace属性和SOAP响应里的xmlns值完全一致,否则JAXB会因为节点命名空间不匹配而忽略这些元素。 - 静态内部类:非静态内部类会持有外部类的引用,在JAXB序列化/反序列化时容易引发异常,改成
static内部类可以避免这个问题。
后续测试建议
修改完成后,你可以在调用WebService的代码中,获取解析后的Users对象,通过getUsers()方法就能拿到所有的User数据了。如果还是有问题,可以先打印一下原始的SOAP响应内容,确认命名空间是否正确,或者用JAXB的Unmarshaller单独做一个小测试,验证解析逻辑是否正常。
内容的提问来源于stack exchange,提问作者stumox
相关产品推荐
相关产品推荐

