问题
I am using Wildfly 10 and developing an application using Spatial Hibernate 5 with PostGIS database. I am getting the below error in runtime.
java.lang.IllegalStateException: Received object of type org.postgresql.util.PGobject
Can anyone suggest some good tutorials as on how to use Spatial Hibernate with Wildfly 10?
回答1:
I had the same problem and I just fixed it. It is basically a dependency issue. The problem is that you are loading the postgresql and/or postgis jars on your wildfly modules and on you deployments WEB-INF/lib. I connect to my database with a regular DS on my standalone.xml
<datasource jndi-name="java:jboss/datasources/mygisDS" pool-name="mygisDS" use-java-context="true">
<connection-url>jdbc:postgresql://localhost:5432/keycloak</connection-url>
<driver>org.postgresql</driver>
<transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
<pool>
<min-pool-size>10</min-pool-size>
<max-pool-size>100</max-pool-size>
<prefill>true</prefill>
<use-strict-min>false</use-strict-min>
<flush-strategy>FailingConnectionOnly</flush-strategy>
</pool>
<security>
<user-name>user</user-name>
<password>XXXXXX</password>
</security>
</datasource>
My drivers
<driver name="org.postgresql" module="org.postgresql">
<xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
</driver>
I tried as @Toastor said, it might have solve his issues but it didnt work with me. Although he gave me a few clues.
So most documentation around the internet is outdated, and there is not much on hibernate spatial 5. I added postgis-jdbc to my maven to my postgresql's module.xml inside my wildfly, but as I was reading THIS IS NOT NECESSARY in Hibernate Spatial 5.X. Wildfly 10 uses 5.0.7 by default, I was using hibernate 5.1.0.Final, so I did not set the scope of any hibernate component on my pom.xml as "provided". But everything kept failing too. So I traced my libraries.
mvn dependency:tree
You have to check for any postgresql libraries that are called or any postgis libraries. What I found out is that Hibernate Spatial 5.1 has some postgresql dependencies, so I excluded them from hibernate spatial.
<exclusion>
<artifactId>postgresql</artifactId>
<groupId>org.postgresql</groupId>
</exclusion>
I did this and I found a problem with PGobject, it said something like class not found. So I added it to jboss-deployment-structure.xml
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="org.postgresql" />
</dependencies>
</deployment>
</jboss-deployment-structure>
And this did the work. If you have a similar problem use maven dependency:tree to trace your libraries.
回答2:
After struggling for days, I found this solution:
Don't connect to your database through a datasource defined on your wildfly. Instead, in your persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="org.hibernate.events.jpa" transaction-type="JTA">
<properties>
<property name="hibernate.dialect" value="org.hibernate.spatial.dialect.postgis.PostgisDialect"/>
<property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
<property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/yourdatabase"/>
<property name="hibernate.connection.username" value="username"/>
<property name="hibernate.connection.password" value="password"/>
<property name="hibernate.connection.pool_size" value="5"/>
<property name="hibernate.show_sql" value="false"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.max_fetch_depth" value="5"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
Because the early 5.0.x versions of hibernate apparently had no proper integration of hibernate-spatial and to avoid classpath problems, I added the file jboss-deployment-structure.xml to my META-INF:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<exclusions>
<module name="org.hibernate" />
<module name="org.postgresql" />
</exclusions>
</deployment>
</jboss-deployment-structure>
This will prevent the wildfly provided hibernate to be used by your deployment so that you can instead add a dependency for the most recent hibernate version (5.1.0 as of this writing). You will then need to add dependencies for hibernate, hibernate-spatial and postgresql-jdbc.
Also note that hibernate 5 doesn't require the @Type annotation anymore.
I have managed to get my project working with the settings above and one of my entities featuring the following attribute / column:
@Column(columnDefinition = "geometry(Point,4326)")
private Point position;
I hope it helps, good luck!
Edit: Using this approach, you need to add your postgresql jdbc driver as a dependency to your project.
Edit:
I have prepared a working sample project demonstrating the use of wf10/hibernate5/postgis - check it out on github:
https://github.com/Pulvertoastmann/wf10postgis/
来源:https://stackoverflow.com/questions/35504016/spatial-hibernate-5-on-wildfly-10