使用Plain Old XML(POX)创建Spring Web服务

时间:2013-03-18 20:20:30

标签: java web-services spring spring-ws

所以,我正在为已经存在的应用程序编写一个Spring Web Service来与之交谈。我让服务工作到它将收到请求的位置并对其做出响应但事实是,应用程序期望响应是在Plain Old 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 0.5。即使是Spring发行版中的POX样本也是在3年前编写的。谢谢你的帮助!

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

2 个答案:

答案 0 :(得分:0)

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

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

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

但是我不确定您可以修改响应的范围。

答案 1 :(得分: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" />

来自comment @ loshad-vtapkah:

  

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