2012-07-07 103 views
4

我正在尝试将DAO注入CXF服务。为此,我使用xml配置。将DAO注入CXF服务

在我的应用程序-servlet.xml中我已经添加下面的条目:

<bean id="blogService" class="blog.BlogEntriesImpl"> 
     <property name="blogDao" ref="blogDao" /> 
    </bean> 

blogDao豆也在此文件中定义。

该服务被配置在另一个XML文件:

<import resource="classpath:META-INF/cxf/cxf.xml" /> 

    <jaxws:endpoint id="blogService" implementor="blog.BlogEntriesImpl" 
    address="/Blog1" /> 

BlogEntriesImpl实现服务接口。它有一个dao属性和一个setter方法。

我调试了应用程序,发现BlogEntriesImpl的一个实例在启动时被实例化并且具有dao属性。我会说这是通过app-servlet.xml中的bean配置完成的。

但是,当我调用服务时,抛出了NullPointerException。这是使用的另一个BlogEntriesImpl实例。

为了解决此问题,我将service实现类(BlogEntriesImpl)中的dao属性声明为静态。该变量在应用程序的开始处设置。但我不喜欢这个解决方案。

有没有更好的方法将注入到CXF服务?

预先感谢您!

回答

4

您说得对,您的BlogEntriesImpl类实际上有两个实例,一个由Spring创建,另一个由Apache CXF创建。您必须明确要求Apache CXF使用Spring bean,而不是提供类。退房Writing a service with Spring,看起来你必须更换:

<jaxws:endpoint id="blogService" implementor="blog.BlogEntriesImpl" address="/Blog1" /> 

有:

<jaxws:endpoint id="blogService" implementor="#blogService" address="/Blog1" /> 

如果Apache CXF无法找到名称blogService豆,考虑从Spring MVC的情况下移动到主上下文( app-servlet.xml)。