Spring WebService中能否用多@PayloadRoot同时接收多个SOAP Body参数?
能否通过@PayloadRoots和多@RequestPayload参数同时接收SOAP Body中的两个Payload?
结论:这种写法不可行
直接用@PayloadRoots搭配多个@RequestPayload参数的方式无法实现需求,核心原因有两点:
@PayloadRoot(包括@PayloadRoots)的作用是匹配SOAP Body中的单个根级元素,@PayloadRoots仅允许一个方法适配多种不同的独立请求类型,而非同一个请求内的多个元素。- Spring WS不支持一个方法存在多个
@RequestPayload注解,框架无法同时绑定两个独立的请求体对象,会触发解析异常或参数绑定失败。
正确解决方案
方案1:创建聚合类映射整个SOAP Body
定义包含PayloadOne和PayloadTwo的聚合类,通过JAXB注解映射SOAP Body中的两个子元素:
@XmlAccessorType(XmlAccessType.FIELD) public class CombinedRequestBody { @XmlElement(name = "PayloadOne", namespace = "namespaceA") private PayloadOne payloadOne; @XmlElement(name = "PayloadTwo", namespace = "namespaceB") private PayloadTwo payloadTwo; // 生成getter、setter方法 }
修改Endpoint方法绑定该聚合类:
@PayloadRoot(localPart = "Body", uri = "http://schemas.xmlsoap.org/soap/envelope/") void receive(@RequestPayload CombinedRequestBody combinedBody) { PayloadOne value1 = combinedBody.getPayloadOne(); PayloadTwo value2 = combinedBody.getPayloadTwo(); // 业务逻辑处理 }
方案2:通过MessageContext手动解析第二个Payload
若不想创建聚合类,可注入MessageContext,手动从SOAP Body中解析第二个Payload:
@PayloadRoot(localPart = "PayloadOne", uri = "namespaceA") void receive(@RequestPayload PayloadOne value1, MessageContext messageContext) throws Exception { // 获取SOAP消息体 SoapMessage soapMessage = (SoapMessage) messageContext.getRequest(); SOAPBody soapBody = soapMessage.getSaajMessage().getSOAPBody(); // 定位并解析PayloadTwo节点 Node payloadTwoNode = soapBody.getElementsByTagNameNS("namespaceB", "PayloadTwo").item(0); JAXBContext jaxbContext = JAXBContext.newInstance(PayloadTwo.class); PayloadTwo value2 = (PayloadTwo) jaxbContext.createUnmarshaller().unmarshal(payloadTwoNode); // 业务逻辑处理 }
内容的提问来源于stack exchange,提问作者tlavarea
相关产品推荐
相关产品推荐

