我正在尝试将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服务?
提前谢谢!
答案 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
)移至主上下文。