在Equinox中配置PostgreSQL DataSource时的NPE

时间:2017-02-13 09:01:25

标签: java eclipse postgresql osgi

我有以下用于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 DataSource?

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

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

2 个答案:

答案 0 :(得分:2)

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

关于PAXJDBC PostgreSQL Driver Adapter页面的说明:

  

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

试试这个驱动程序:

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

答案 1 :(得分:0)

您可能会遇到问题PAXJDBC-107。 Pax-jdbc-config使用反射来编写属性。如果数据源具有带有Integer参数但不带int的setter,则它当前有效。我打算在接下来的日子里解决这个问题并做一个新版本。