我正在运行一个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字段 works! .
但我不认为这是一个合适的解决方案,因为我更喜欢使用安装在wildfly上的驱动程序 .
我为我的英语和问题布局道歉这是我的第一个问题 .
2 回答
将
org.postgres
依赖项添加到 war manifest 为我解决了这个问题 .这是一个
maven
片段:这里是生成的
MANIFEST.MF
(见最后一行):因此,设法通过简单地将插入方法更改为现在需要任何postgres jdbc特定方法来解决此问题:
将查询更改为此,
并将准备好的语句中的方法更改为:
这解决了我的问题,不确定它是否是最好/最有效的解决方案,但它的工作原理 .