2011-06-07 96 views
7

我想将CXF与Google Guice集成。我已经在我的项目中使用了Guice,我想避免添加额外的依赖项。CXF和Google Guice使用JAX-RS + JAX-WS

CXF是我的选择,因为其中一个要求是能够为服务的用户提供XML,JSON,JSONP和SOAP接口而不会有重复的代码(现在我们拥有SOAP特定的类,对于XML我们使用Struts和JSON我们写了我们自己的解析器,我知道,我也觉得很肮脏)。

无论如何,afaik,CXF可以满足这个要求,所以看起来我坚持CXF。

关于如何将Guice与CXF整合的任何想法或建议?我想扩展CXFNonSpringJaxrsServlet课程,并攻击Guice,但似乎我会做别人已经做过的事情。

回答

4

对于CXF 2.4.x,CXF不再使用Spring进行内部配置。因此,如果没有Spring,你几乎可以做任何事情。

配置零件肯定是一个问题。但是,所有Spring配置的东西都只是CXF API的精简包装。因此,你可以通过API配置几乎所有的东西。你可能只需要多挖一点。

作为一个例子,对于CXF 2.4,我们现在已经开始支持在OSGi中使用Blueprint而不是Spring。蓝图支持并不需要任何Spring的东西,但是它是以它为模型的。

+0

这是可能的,你是对的...... CXF足够配置(从拦截器到invokers到巴士工厂),你可以在Guice中接线。系统和测试用例提供了许多例子。 – chahuistle 2011-06-16 19:51:43

1

你有问题。 CXF完全依赖于Spring,因为它由Spring进行内部配置并且使用Spring的设施非常广泛。因此,我认为尝试从Spring中奖励CXF是不现实的,因此您可以使用Guice;在最低,你必须复制所有配置与自定义Guice提供程序,它仍然不会工作(部分CXF使用一些Spring的Web层)。

您可以尝试使用Spring的JavaConfig样式代替您的代码。这是主要是类似于Guice做的事情(据我所知)。或者我想你可以尝试在同一个应用中使用两个独立的DI框架......虽然这让我感觉像是一个“热闹”失败的机会。

3

这是我一直在使用的(cxf-2.5.0)。

@Singleton 
public class WebServiceServlet extends CXFNonSpringServlet { 
    private static final long serialVersionUID = 1L; 
    private final SamaService samaService; 

    @Inject 
    public WebServiceServlet(SamaService samaService) { 
     this.samaService = samaService; 
    } 

    @Override 
    protected void loadBus(ServletConfig sc) { 
     super.loadBus(sc); 
     BusFactory.setDefaultBus(getBus()); 
     Endpoint.publish("/Data.asmx", samaService); 
    } 
} 
+0

我做了一个simliar servlet,但在loadBus()内部使用了注入器,而不是注入服务。代码发布在这里:http://code.google.com/p/guice-cxf/issues/detail?id=1 – BrunoJCM 2012-11-16 14:18:42

+0

为什么行'BusFactory.setDefaultBus(getBus())'?在你的例子中似乎没有必要,工作正常W/O。 – 2016-09-02 09:10:10