如何在SOAP请求体中发送列表?解决空指针异常问题
从你的代码和SOAP请求来看,问题出在请求体结构和Java类定义不匹配,导致Web服务无法正确解析列表参数,进而抛出空指针异常。
当前请求的问题
你现在的SOAP请求把individualRequest作为一个包含<Long>子标签的容器,但你的Java类里individualRequest是一个直接存储Long值的列表(通过@XmlElement(type = Long.class)标注),没有额外的层级包装。这种不匹配会让服务端无法识别列表元素,导致individualRequest列表未被初始化,最终触发空指针。
正确的SOAP请求格式
根据你的Java类定义,正确的请求应该是在ns3:retrieveIndividualsBOBStatus节点下,直接添加多个individualRequest标签,每个标签的内容就是Long类型的数值:
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> <env:Header/> <env:Body> <ns3:retrieveIndividualsBOBStatus xmlns="" xmlns:ns3="http://webservice.com/"> <!-- 单个列表元素 --> <individualRequest>710039</individualRequest> <!-- 如果有多个元素,继续添加即可 --> <individualRequest>710040</individualRequest> <individualRequest>710041</individualRequest> </ns3:retrieveIndividualsBOBStatus> </env:Body> </env:Envelope>
为什么这样有效?
你的Java类中,@XmlElement(type = Long.class)标注在List<Long>字段上,这告诉JAXB(SOAP服务常用的XML绑定框架):这个列表不需要额外的包装节点,每个列表元素直接以字段名individualRequest作为标签,内容就是Long值。服务端接收到这种结构后,就能正确把多个individualRequest标签解析成List<Long>对象,避免空指针异常。
额外说明(可选)
如果你希望用包裹式的结构(比如用一个父节点包裹所有列表元素),可以修改Java类,添加@XmlElementWrapper注解:
@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "retrieveIndividualsBOBStatus", propOrder = { "individualRequest" }) public class RetrieveIndividualsBOBStatus { @XmlElementWrapper(name = "individualRequests") // 新增包裹节点 @XmlElement(type = Long.class, name = "individualRequest") protected List<Long> individualRequest; // ... }
对应的SOAP请求就会变成:
<ns3:retrieveIndividualsBOBStatus xmlns="" xmlns:ns3="http://webservice.com/"> <individualRequests> <individualRequest>710039</individualRequest> <individualRequest>710040</individualRequest> </individualRequests> </ns3:retrieveIndividualsBOBStatus>
但如果不能修改服务端的Java类,就采用前面第一种请求格式即可。
内容的提问来源于stack exchange,提问作者landscape1250

