将DAO注入到CXF服务中

4
我将尝试将DAO注入到CXF服务中。为此,我正在使用xml配置。
在我的app-servlet.xml文件中,我添加了以下条目:
    <bean id="blogService" class="blog.BlogEntriesImpl">
        <property name="blogDao" ref="blogDao" />
    </bean>

这个文件中还定义了blogDao bean。

服务是在另一个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的实例。
为了解决问题,我将dao属性声明为静态变量,放在服务实现类(BlogEntriesImpl)中,变量在应用程序启动时被设置。但我不喜欢这种解决方案。
有更好的方法将dao注入到CXF服务中吗?
谢谢!
1个回答

4
你说得对,实际上有两个你的BlogEntriesImpl类实例,一个是由Spring创建的,另一个是由Apache CXF创建的。你必须显式地要求Apache CXF使用Spring bean而不是提供一个类。请查看使用Spring编写服务,看起来你需要替换以下内容:
<jaxws:endpoint id="blogService" implementor="blog.BlogEntriesImpl" address="/Blog1" />

使用:

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

如果Apache CXF找不到名为blogService的bean,请考虑将其从Spring MVC上下文(app-servlet.xml)移动到主上下文中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接