将DAO注入CXF服务

时间:2012-07-07 14:09:17

标签: java web-services spring dependency-injection cxf

我正在尝试将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的另一个实例。

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

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

提前谢谢!

1 个答案:

答案 0 :(得分: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的bean,请考虑将其从Spring MVC上下文(app-servlet.xml)移至主上下文。