我们目前正在将现有的 JBoss EJB 应用程序移植到纯 servlet 解决方案,该解决方案应该在 Jetty 中运行(我们当前使用版本 6,但该版本大多不相关),并使用 Guice 进行依赖注入和 AOP。尽管存在巨大的复杂性,但到目前为止我们还是相当成功的。持久层和我们的大部分服务都已启动并正在运行,包括 JAX-RS REST 服务。
然而,当我们开始移植现有的 JAX-WS SOAP 服务时,我们遇到了困难。我们已经花了大约一天的时间在网上搜索,似乎很多人几年前都遇到过同样的问题。然而,似乎没有人提供一个好的解决方案。
有关我们架构的更多详细信息
我们正在使用一个GuiceServletContextListener创建我们的全局注入器,它配置了所有模块。我们只有一个注入器是至关重要的,因为我们需要支持单例。
据我们所知,具体的 JAX-WS 实现并不相关。我们目前正在试验 Metro,但我们也可以使用 Apache-CXF。
迄今为止评估的方法
这个 stackoverflow 帖子建议手动创建服务,然后通过 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);
同一个 stackoverflow 帖子还建议使用JAX-WS Guice 集成总的来说,这听起来是一个不错的方法。然而,这个解决方案创建了自己的注入器,因此与我们基于 GuiceServletContextListener 的方法不兼容。我们发现这个线程讨论完全相同的问题,但似乎没有人找到解决方案。
我们还看了吉斯-CXF这应该使 Apache-CXF 集成到 Guice 应用程序中变得容易,但据我们了解描述,到目前为止这只适用于 JAX-RS REST 服务。
为了不再浪费时间在这上面并试图重新发明轮子,我们在这里发布了这个问题,希望其他人已经经历过这个地狱,并且可以给我们一些指导,甚至可能是一些可行的例子。任何帮助是极大的赞赏。