使用 wildfly 插入 Postgres 的 json 列
Inserting Postgres' json column using wildfly
我是 运行 一个休息的网络应用程序 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);
这个解决方案工作正常,因为我从一个简单的 main 运行 class 尝试了它,我可以插入任何我想要的 json,但是当我尝试这个代码时 运行 在 wildfly 上我得到了这个 class not found error:
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.
再尝试几次后,我意识到在 war 中包含 jar 会使 wildfly 将其部署为驱动程序。
[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
所以我尝试了另一种方法,在部署 war 时,我将数据源从原始 pgsql 驱动程序更改为在部署应用程序期间启动的数据源,它 有效! 我可以插入 json 个字段。
但我认为这不是一个合适的解决方案,因为我更喜欢使用安装在 wildfly 上的驱动程序。
我为我的英语和问题布局道歉这是我的第一个问题。
因此设法通过简单地将插入方法更改为现在需要任何 postgres jdbc 特定方法来解决此问题:
将查询更改为此,
INSERT INTO table (json_column) VALUES (to_json(?::json))
并将准备好的语句中的方法更改为:
preparedStatement.setString(1, json);
这解决了我的问题,不确定它是否是 best/most 有效的解决方案,但它有效。
将 org.postgres
依赖项添加到 war 清单 解决了我的问题。
这是一个 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
我是 运行 一个休息的网络应用程序 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);
这个解决方案工作正常,因为我从一个简单的 main 运行 class 尝试了它,我可以插入任何我想要的 json,但是当我尝试这个代码时 运行 在 wildfly 上我得到了这个 class not found error:
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.
再尝试几次后,我意识到在 war 中包含 jar 会使 wildfly 将其部署为驱动程序。
[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
所以我尝试了另一种方法,在部署 war 时,我将数据源从原始 pgsql 驱动程序更改为在部署应用程序期间启动的数据源,它 有效! 我可以插入 json 个字段。
但我认为这不是一个合适的解决方案,因为我更喜欢使用安装在 wildfly 上的驱动程序。
我为我的英语和问题布局道歉这是我的第一个问题。
因此设法通过简单地将插入方法更改为现在需要任何 postgres jdbc 特定方法来解决此问题:
将查询更改为此,
INSERT INTO table (json_column) VALUES (to_json(?::json))
并将准备好的语句中的方法更改为:
preparedStatement.setString(1, json);
这解决了我的问题,不确定它是否是 best/most 有效的解决方案,但它有效。
将 org.postgres
依赖项添加到 war 清单 解决了我的问题。
这是一个 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