1

所以,我正在为一个已经存在的应用程序编写一个 Spring Web Service 来与之交谈。我让服务工作到它将接收请求并对其进行响应的位置,但问题是,应用程序希望响应采用普通旧 XML (POX) 格式。我的响应当前附加了 SOAP 标头,如下所示:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
        <Person>
            <FirstName>John</FirstName>
            <LastName>Smith</LastName>
        </Person>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我需要它返回的是:

<Person>
    <FirstName>John</FirstName>
    <LastName>Smith</LastName>
</Person>

根据我的发现,Spring 非常有能力做到这一点,我认为这与DomPoxMessageFactory我发现的所有示例都与 Spring WS 的旧版本(如 v1.5)有关。甚至 Spring 发行版中的 POX 样本也是 3 年前编写的。谢谢你的帮助!

编辑:我也在使用 spring-ws v2.1.2。到目前为止,我的代码非常类似于您将在此处找到的代码:http: //static.springsource.org/spring-ws/sites/2.0/reference/html/tutorial.html

4

2 回答 2

0

您可以实现EndpointInterceptorAdapter并更改覆盖 handleResponse 的响应。:

@Override
public boolean handleResponse(MessageContext messageContext_, Object endpoint_) 
throws IOException {

WebServiceMessage _webServiceMessage = messageContext_.getResponse();
SoapMessage _soapMessage = (SoapMessage) _webServiceMessage;
// modify the content

我不确定您可以在多大程度上修改响应。

于 2013-03-21T13:04:27.300 回答
0

对我来说,我所需要的只是在基于 java 的配置中:

@Bean(name = "messageFactory")
public WebServiceMessageFactory messageFactory() {
    return new DomPoxMessageFactory();
}

这意味着 MessageDispatcherServlet 将切换到 POX 而不是默认的 SOAP。

如果您使用基于 XML 的配置,应该这样做:

<bean id="messageFactory" class="org.springframework.ws.pox.dom.DomPoxMessageFactory" />

来自@loshad-vtapkah 的评论:

只有在 request.xml 中指定了命名空间时,此修改才有效。对于您提供的链接上指定的案例,将省略命名空间。因此,您需要为 CountryEndpount 设置空命名空间(检查 PayloadRoot 注释)或扩展 DomPoxMessage.createWebServiceMessage() 方法来更新文档节点命名空间。

于 2016-09-20T15:44:51.057 回答