【问题标题】:Inject DAO into CXF Service将 DAO 注入 CXF 服务
【发布时间】:2012-07-07 14:09:17
【问题描述】:

我正在尝试将 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 服务中?

提前谢谢你!

【问题讨论】:

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


    【解决方案1】:

    你是对的,你的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) 移至主上下文。

    【讨论】:

      猜你喜欢
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      相关资源
      最近更新 更多