我们正在将应用程序套件中的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)
我错过了什么或我哪里出错?
答案 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不在我的应用程序的类路径中。添加它解决了我的问题。