在java servlet中使用Spring(SOAP)Web服务

时间:2011-09-30 23:47:49

标签: java spring web-services jax-ws

有没有办法在不在客户端上生成存根的情况下使用基于SOAP的Spring Web服务(如指向JAX-WS的umpteen线程所示)?

以下是我的完整情景:

我有2个网络应用程序,比如APP1& APP2,两者都有Spring支持。 APP2将它的API暴露为接受POJO(Reqeust和Response对象)的Spring-WS。肥皂。现在,我想从APP1调用这些Web服务,但是希望避免使用WSDL frmo APP2创建存根。这可能吗?

有关详细信息,请参阅我的Web服务操作之一:

@PayloadRoot(localPart = "CreateNewRequest", namespace = "myNameSpace")
public CreateNewReqResponse createNewRequest( CreateNewReqRequest requestObj ) throws Exception
{
    NewCase newCase = this.localSpringService.createNewCase( requestObj.getParam1(), requestObj.getParam2() );
    CreateNewReqResponse response = this.objectFactory.createCreateNewReqResponse();
    CreateNewReqResponseObject responseObject = this.objectFactory
            .createCreateNewReqResponseObject();
    if( null != newCase )
    {
        responseObject.setParam1( newCase.getParam1() );
        responseObject.setParam2( newCase.setParam2() );
        }
        responseObject.setCaseRequestedDate( caseRequestedDate );
    }
    response.setResponseObject( responseObject );
    return response;
}

现在,正如您所看到的,Web服务方法接受CreateNewReqRequest并返回CreateNewReqResponse。我想弄清楚的是我如何从APP1调用这个Web服务,它对这些类没有任何线索 - CreateNewReqRequest和CreateNewReqResponse?除了使用JAX-WS在APP1(来自WSDL)中创建存根之外,没有其他方法吗?

有问题的应用程序都是我们自己的(我们已经开发了它们)但是在不同的服务器上运行,因为APP1无法直接调用Web服务 - 跨域策略。因此,我将在APP1中编写一个servlet,它将使用APP2公开的Web服务。

2 个答案:

答案 0 :(得分:1)

在他们那天结束时,SOAP是一个简单的HTTP协议。因此,如果您希望放弃使用JAX-WS,您可以开始使用原始http连接并手动编写SOAP请求,并自行手动解析SOAP响应。这只是意味着你重新发明了JAX-WS客户端存根的轮子。

所以如果你绝对想要避免Stub创建,那么请使用HTTP post并在WSDL端点URL获取Messages。

客户端Stub所做的只是简单地为您实现该实现。即,您不必处理SOAP / WSDL和http连接的细节,您将在更高级别处理SOAP,即通过Java对象。

您还可以查看其他库,例如Apache CXF或Axis,但即使在那里,您也必须生成客户端存根。

因此,您想要问的问题是,您是否真的想要进入并手动使用http连接和SOAP XML,或让框架为您执行那些繁重的工作。

回复Nitin的评论如下:

回答您的问题,1。是的,如果WSDL发生更改,您将不得不重新创建存根,如果您不使用存根但手动解析所有内容,则必须更改该代码。因此,两者之间没有区别。如果WSDL(即客户端和服务之间的合同)发生变化,您的程序将不得不改变。即使对于REST也是如此,即如果服务发布的合同发生更改(可能是参数或操作等),则必须更改客户端代码。没有逃脱。希望公共Webservices可以设计为允许将来修改,并且这样的修改不会在一夜之间发生,从而为您提供足够的时间来修改代码。此问题与Web服务的实现方式无关,即Spring Web Service与此无关。

您似乎忽略了JAX-WS,Axis,CXF等SOAP框架为您生成的客户端存根。客户端存根是与Web服务通信的一种方式。这不是唯一的方法。客户端存根是首选方法,因为它抽象出了手动处理SOAP调用的细节。因此,您不再需要发明轮子并实现SOAP(XML)解析库,而是可以将精力集中在您正在编写的实际应用程序上。在您的实际程序中,您只需要处理POJO,而不必担心SOAP魔术如何发生,即如何转换数据并将其打包在SOAP消息中,使用HTTP连接将SOAP消息发送到服务,处理响应,解析响应SOAP消息并检索您关心的数据。所有这一切都可以避免使用POJO。您设置请求的属性,对客户端存根服务方法进行方法调用,并接收一个对象,其他一切都是您不必担心(理想情况下)。

我希望这有点清楚。

答案 1 :(得分:0)

看看WebServiceTemplate课程。