使用CXF发布非Spring Web服务

时间:2014-12-03 18:34:50

标签: java spring web-services servlets cxf

我们正在将应用程序套件中的Web服务引擎从AXIS1.1升级到CXF3.0.2。我在应用程序中发布Web服务时遇到了一些挑战。

根据我的理解,有一种SPRING方法可以在CXF中发布服务,而且还有一种非弹簧方法。我的偏好是采用非弹簧方法,因为我们的应用程序是基于STRUTS框架构建的,我不想将SPRING作为升级工作的一部分。如果我没有其他选择,我愿意选择SPRING方法发布CXF网络服务。

这是我发布网络服务的非弹簧方法:

我有一个扩展org.apache.cxf.transport.servlet.CXFNonSpringServlet的servlet并覆盖了loadBus(ServletConfig)方法(loadBus方法的代码片段如下所示)。此weblet在web.xml中配置,以接收源自URL模式/ services / *

的所有请求
@Override
public void loadBus(ServletConfig servletConfig)
{
   super.loadBus(servletConfig);
   Bus bus = getBus();
   BusFactory.setDefaultBus(bus);
   Endpoint ep = Endpoint.create(new myWebService());
   ep.publish("/myService");
}

上面代码片段中的Endpoint类是javax.xml.ws.Endpoint。我的期望是我应该看到带有URL http://www.myhost.com/contextRoot/services/的已发布服务。但是我用URL看到的是“找不到服务” - 显然发布失败..服务器控制台上的异常堆栈跟踪如下:

  

java.lang.IllegalArgumentException:无法为此地址创建URL   /为myService          at com.sun.xml.ws.transport.http.server.EndpointImpl.publish(EndpointImpl.java:237)          在com.chase.ccs.servlet.CCSCXFNonSpringServlet.loadBus(CCSCXFNonSpringServlet.java:37)          在org.apache.cxf.transport.servlet.CXFNonSpringServlet.init(CXFNonSpringServlet.java:76)          在com.ibm.ws.webcontainer.servlet.ServletWrapper.init(ServletWrapper.java:329)          在com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.init(ServletWrapperImpl.java:168)          在com.ibm.ws.webcontainer.servlet.ServletWrapper.load(ServletWrapper.java:1283)          在com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:973)          在com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3703)          在com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:304)          在com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:953)          在com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1655)          在com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:195)          在com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:452)          在com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:511)          在com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:305)          在com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:276)          at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214)          在com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113)          at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)          在com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)          at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)          在com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)          在com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)          在com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)          在com.ibm.io.async.ResultHandler $ 2.run(ResultHandler.java:905)          在com.ibm.ws.util.ThreadPool $ Worker.run(ThreadPool.java:1650)

我错过了什么或我哪里出错?

2 个答案:

答案 0 :(得分:0)

我也遇到了同样的情况。你可以改变你的loadBus方法如下。 它对我有用。

@Override 
public void loadBus(ServletConfig servletConfig){
super.loadBus(servletConfig);
ServerFactoryBean factory = new ServerFactoryBean();
factory.setBus(bus);
factory.setServiceClass(myWebService.class);
factory.setAddress("/myService");
factory.create();
}

答案 1 :(得分:0)

我知道这个答案可能会有点晚,但我最近遇到了类似的问题(cxf 3.1.4)。就我而言, cxf-rt-frontend-jaxws jar不在我的应用程序的类路径中。添加它解决了我的问题。