【问题标题】:Inserting Postgres' json column using wildfly使用 Wildfly 插入 Postgres 的 json 列
【发布时间】: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


【解决方案1】:

org.postgres 依赖添加到war manifest 为我解决了这个问题。

这是mavensn-p:

<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

【讨论】:

  • 这实际上很有意义,这正是我正在寻找的解决方案,有机会我会尝试一下。
【解决方案2】:

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

将查询更改为此,

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

并将准备好的语句中的方法更改为:

 preparedStatement.setString(1, json);

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

【讨论】:

    猜你喜欢
    • 2018-08-06
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 2021-07-19
    • 2017-05-19
    • 2018-08-06
    相关资源
    最近更新 更多