【问题标题】:NPE when configuring PostgreSQL DataSource in Equinox在 Equinox 中配置 PostgreSQL 数据源时的 NPE
【发布时间】:2017-02-13 09:01:24
【问题描述】:

我有以下 PAX 的 DataSource 配置文件:

osgi.jdbc.driver.class=org.postgresql.Driver
url=jdbc:postgresql://localhost:5432/demo
dataSourceName=demo-pg
user=demo
password=demo

它在 Karaf 中创建 DataSource,但是在 Eclipse 中,使用 Equinox OSGi 启动器,我得到了 NPE:

java.lang.NullPointerException
    at java.util.Hashtable.put(Hashtable.java:459)
    at java.util.Properties.setProperty(Properties.java:166)
    at org.postgresql.ds.common.BaseDataSource.setProperty(BaseDataSource.java:1030)
    at org.postgresql.ds.common.BaseDataSource.setUrl(BaseDataSource.java:964)
    at org.postgresql.osgi.PGDataSourceFactory.configureBaseDataSource(PGDataSourceFactory.java:65)
    at org.postgresql.osgi.PGDataSourceFactory.createSimpleDataSource(PGDataSourceFactory.java:127)
    at org.postgresql.osgi.PGDataSourceFactory.createDataSource(PGDataSourceFactory.java:149)
    at org.ops4j.pax.jdbc.config.impl.DataSourceRegistration.createDs(DataSourceRegistration.java:108)
    at org.ops4j.pax.jdbc.config.impl.DataSourceRegistration.<init>(DataSourceRegistration.java:63)
    at org.ops4j.pax.jdbc.config.impl.DataSourceFactoryTracker.addingService(DataSourceFactoryTracker.java:42)
    at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:941)
    at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:1)
    at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256)
    at org.osgi.util.tracker.AbstractTracked.trackInitial(AbstractTracked.java:183)
    at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:318)
    at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:261)
    at org.ops4j.pax.jdbc.config.impl.DataSourceConfigManager.updated(DataSourceConfigManager.java:80)
    at org.apache.felix.cm.impl.helper.ManagedServiceFactoryTracker.updated(ManagedServiceFactoryTracker.java:159)
    at org.apache.felix.cm.impl.helper.ManagedServiceFactoryTracker.provideConfiguration(ManagedServiceFactoryTracker.java:93)
    at org.apache.felix.cm.impl.ConfigurationManager$UpdateConfiguration.run(ConfigurationManager.java:1772)
    at org.apache.felix.cm.impl.UpdateThread.run0(UpdateThread.java:141)
    at org.apache.felix.cm.impl.UpdateThread.run(UpdateThread.java:109)
    at java.lang.Thread.run(Thread.java:745)

在调试器中检查后,我发现由于属性PROTOCOL_VERSION 为空而引发错误。我试图在配置文件中设置变量:

protocolVersion=3

但我仍然遇到同样的错误。

如何在 Equinox/Eclipse 运行时配置 PostgreSQL 数据源?

我正在使用 PostgreSQL 驱动程序版本 9.4-1200:

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.4-1200-jdbc41</version>
    </dependency>

【问题讨论】:

    标签: java eclipse postgresql osgi


    【解决方案1】:

    新的 PostgreSQL 42.1.1 驱动程序似乎已解决。

    PAXJDBC PostgreSQL Driver Adapter 页面上的注释说明:

    当前的 postgresql 版本是有效的捆绑包,并且还提供了 DataSourceFactory。因此,如果您使用最新版本,您将不再需要此适配器。

    试试这个驱动:

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.1.1</version>
    </dependency>
    

    【讨论】:

      【解决方案2】:

      您可能遇到了问题PAXJDBC-107。 Pax-jdbc-config 使用反射来写入属性。如果数据源有一个带有 Integer 参数但不带有 int 的 setter,它目前可以工作。我计划在接下来的几天内解决这个问题并发布一个新版本。

      【讨论】:

      • 好的..那么这可能只是postgresql版本的问题。
      • 看起来是这样。我不确定我是否应该写这个作为答案......但是,不应该从 Maven 存储库中删除错误版本吗?
      • 发布的工件永远不会从 maven 存储库中删除,这就是为什么您有下一个版本可用。如果您无法使用最新发布的版本,请尝试使用最新的 SNAPSHOT 版本。如果那个项目没有按计划工作,并且有问题的项目是一个开源项目,那就让自己参与进来。
      猜你喜欢
      • 2016-08-08
      • 1970-01-01
      • 2017-06-27
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      相关资源
      最近更新 更多