我们目前正在将现有的JBoss EJB应用程序移植到纯servlet解决方案中,该解决方案应该在Jetty中运行(我们目前使用的是版本6,但版本大多不相关)并且使用Guice进行依赖注入和AOP 。尽管存在巨大的复杂性,但迄今为止我们已经取得了相当大的成功。持久层和我们的大多数服务都已启动并运行,包括JAX-RS REST服务。
然而,当我们开始移植现有的JAX-WS SOAP服务时,我们遇到了困难。我们已经花了大约一天的时间在网上搜索,似乎很多人在几年前遇到了同样的问题。但是,似乎没有人能提供一个好的解决方案。
我们使用GuiceServletContextListener来创建配置了所有模块的全局Injector。至关重要的是我们只需要一个注射器,因为我们需要支持单身人士。
据我们所知,具体的JAX-WS实现并不相关。我们目前正在试验Metro,但我们也可以使用Apache-CXF。
This stackoverflow post建议手动创建服务,然后通过Endpoint.publish(...)发布它。但是,这不是一个可接受的解决方案,因为它不使用Jetty容器,而是启动自己的HTTP服务器。
final Module module = new HelloModule();
final Injector injector = Guice.createInjector(module);
final HelloService helloService = injector.getInstance(HelloService.class);
Endpoint.publish("http://localhost:8080/helloService", helloService);
The same stackoverflow post还建议使用JAX-WS Guice integration,这通常听起来像是一种好方法。但是,此解决方案会创建自己的Injector,因此与基于GuiceServletContextListener的方法不兼容。我们发现this thread讨论了完全相同的问题,但似乎没有人有解决方案。
我们还查看了guice-cxf,它应该可以轻松地将Apache-CXF集成到Guice应用程序中,但据我们所理解的描述,这仅适用于JAX-RS REST服务。 / p>
为了不浪费任何时间在这上面并试图重新发明轮子,我们在这里发布了这个问题,希望其他人已经经历过这个地狱,并且可以给我们一些指示甚至是一些有用的例子。非常感谢任何帮助。
答案 0 :(得分:3)
我们终于通过扩展CXFNonSpringServlet来优雅地解决了这个问题。您只需覆盖loadBus()方法,您可以在其中配置所有服务端点。
@Singleton
public class SoapServlet extends CXFNonSpringServlet {
private static final long serialVersionUID = 1L;
private final SomeFacade someFacade;
@Inject
SoapMachineServlet(final SomeFacade someFacade) {
this.someFacade = someFacade;
}
@Override
public void loadBus(ServletConfig servletConfig) throws ServletException {
super.loadBus(servletConfig);
Bus bus = getBus();
BusFactory.setDefaultBus(bus);
Endpoint.publish("/SomeFacade", someFacade);
}
}
类本身只是一个servlet,然后可以使用ServletModule绑定:
public class SomeModule extends ServletModule {
@Override
protected void configureServlets() {
serve("/some/path*").with(SoapServlet.class);
}
}