【发布时间】:2016-01-31 04:28:53
【问题描述】:
我正在运行一个作为 REST API 的 Web 应用程序,并且我正在使用 Wildfly 9.0.2 和 PostgreSQL。数据库连接使用的是最新的jdbc4.2驱动,jre是oracle的jr8。
我在topic 之后安装了 jdbc,并且到目前为止它运行良好,我使用 wildfly 管理控制台安装了数据源。
所以当我尝试插入 json 字段时,问题就来了。我很快意识到 JDBC 没有像 String、Integer、Timestamp 等那样插入 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 包含在 war 中会使 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
所以我尝试了一种不同的方法,在部署战争时,我将数据源从原始 pgsql 驱动程序更改为在应用程序部署期间启动的数据源,它有效!我可以插入 json 字段.
但我认为这不是一个合适的解决方案,因为我更喜欢使用安装在 wildfly 上的驱动程序。
我为我的英语和问题布局道歉,这是我的第一个问题。
【问题讨论】:
-
听起来好像 Wildfly 中包含的 JDBC 驱动程序是一个过时的版本。为什么您认为使用 Postgres 的当前驱动程序不是“正确”的解决方案?
-
这是最新的,因为我在项目和 Wildfly 中使用相同的 .jar 文件从头开始完整的 Wildfly 配置,专门测试这个。
-
我设法让它工作,但没有使用 postgres 特定的 jdbc,方法是将查询更改为:
VALUES (?,?,to_json(?::json),?)并将参数设置为字符串:preparedStatement.setString(++i,json); -
您应该将其添加为答案并接受它
标签: java json postgresql jdbc wildfly