使用wildfly插入Postgres的json列

时间:2015-10-30 17:01:15

标签: java json postgresql jdbc wildfly

我正在运行一个Web应用程序,它是一个rest API,我正在使用wildfly 9.0.2和PostgreSQL。数据库连接使用最新的jdbc4.2驱动程序,jre是oracle的jr8。

我在此topic之后安装了jdbc,并且到目前为止我已经使用wildfly管理控制台安装了数据源。

因此,当我尝试插入json字段时,问题就出现了。我很快意识到JDBC没有一个直接的方法来插入一个json字段,就像它让我们说的字符串,整数,时间戳等等。所以我在网上发现这个解决方案,我现在不记得了:

oPGobject jsonObject = new PGobject();
jsonObject.setType("json");
jsonObject.setValue(new Gson().toJson(ctrlClienteComunicacao));
preparedStatement.setObject(++i,jsonObject);

这个解决方案工作正常,因为我尝试从一个简单的主类运行它,我可以插入任何我想要的json,但是当我在wildfly上运行时尝试这个代码时,我发现这个类没有找到错误:

java.lang.NoClassDefFoundError: org/postgresql/util/PGobject

我的第一个尝试是从JDBC库中删除提供的属性,以便将它包含在.war中。然后我收到了一个新错误:

org.postgresql.util.PSQLException: Can't infer the SQL type to use for an instance of org.postgresql.util.PGobject. Use setObject() with an explicit Types value to specify the type to use.

经过几次尝试后,我意识到在战争中加入jar会让野外蝇把它作为驱动程序部署。

[org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-2) WFLYJCA0018: Started Driver service with driver-name = VirtualForum.war_org.postgresql.Driver_9_4

所以我尝试了另一件事,在部署战争时,我将数据源从原始的pgsql驱动程序更改为在部署应用程序期间启动的数据源正常工作!我可以插入json字段

但我不认为这是一个合适的解决方案,因为我更喜欢使用安装在wildfly上的驱动程序。

我为我的英语和问题布局道歉这是我的第一个问题。

2 个答案:

答案 0 :(得分:3)

战争清单添加org.postgres依赖项为我解决了这个问题。

以下是maven代码段:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <archive>
                    <manifestEntries>
                        <Dependencies>org.postgres</Dependencies>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

这是生成的MANIFEST.MF(参见最后一行):

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: dedek
Created-By: Apache Maven 3.3.3
Build-Jdk: 1.8.0_51
Dependencies: org.postgres

答案 1 :(得分:2)

所以设法通过简单地将插入方法改为现在需要任何postgres jdbc特定方法来解决这个问题:

将查询更改为

INSERT INTO table (json_column) VALUES (to_json(?::json))

将准备好的声明中的方法更改为:

 preparedStatement.setString(1, json);

这解决了我的问题,不确定它是否是最佳/最有效的解决方案,但它有效。