当使用来自其他bundle的服务接口时,OSGI bundle需要jdbc驱动程序

时间:2013-06-03 07:51:57

标签: jdbc osgi blueprint-osgi

我在Fuse ESB中部署了3个简单的捆绑WebService,DataService和DataSource,每个捆绑使用maven捆绑插件和蓝图连接bean并注册服务。数据源包包含连接详细信息,并通过JNDI注册Oracle jdbc数据源。 DataService使用OpenJPA并具有DAO,域实体和服务接口实现,其中一种方法在数据库中查询域实体并返回字符串。使用Export-Package导出服务接口。

Web服务引用了从DataService包导出的服务接口。

我无法在没有Web服务包导入oracle jdbc驱动程序的情况下使用此设置 - 我认为不需要它。我得到了

java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver from bundle 430 (web-service-bundle)

除非我导入oracle.jdbc.driver包,否则

异常。

DataSource包将数据源作为服务导出到blueprint.xml

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
    <!-- other properties go here -->
</bean>

<service ref="dataSource" interface="javax.sql.DataSource">
    <service-properties>
        <entry key="osgi.jndi.service.name" value="jdbc/dataSource" />
    </service-properties>
</service>

DataService在其中使用的persistence.xml

  <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
  <jta-data-source>osgi:service/jdbc/dataSource</jta-data-source>

此Service接口从DataService服务包

导出
class SomeService implements Service {
    private Dao dao;
    public void String getString() {
        Entity entity = dao.getEntity();
        return entity.getString();
    }

}

WebService捆绑包使用哪个

@WebService
class WebService {

    private Service service;

    @WebMethod
    public String getString() {
        return service.getString();
    }
}

1 个答案:

答案 0 :(得分:0)

您可以尝试将DataSource导出为OSGi服务吗?使用aries jndi,你仍然可以通过jndi使用它。这应该可以在没有知道oracle驱动程序的webservice bundle的情况下工作。见http://www.liquid-reality.de/display/liquid/2012/01/13/Apache+Karaf+Tutorial+Part+6+-+Database+Access

对于您的确切示例,将有助于查看代码。