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 实例。

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

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

先感谢您!

4

1 回答 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 找不到带有 name 的 bean blogService,请考虑将其从 Spring MVC 上下文 ( app-servlet.xml) 移至主上下文。

于 2012-07-07T15:05:39.357 回答