Wildfly Postgres JDBC 模块问题
Wildfly Postgres JDBC module issue
我在 Wildfly 10 中将 postgres jdbc 驱动程序配置为模块。我想做的是将该驱动程序用作将部署在服务器上的应用程序中的依赖项 - 所以在应用程序中,我将此依赖项标记为已提供(在 pom.xml 文件中),但它似乎不起作用。
当前配置:
在 wildfly-10.1.0.Final\modules\org\postgresql\main
添加了 Wildfly postgres 模块,其中有:postgresql-9.4-1206-jdbc4.jar
和 module.xml
,内容如下:
<module xmlns="urn:jboss:module:1.1" name="org.postgresql">
<resources>
<resource-root path="postgresql-9.4-1206-jdbc4.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>
模块用于定义数据源。至此,一切都运行良好 - 使用 hibernate 帮助表很高兴地映射到实体。除了一件事:
我开始使用 javax.persistence.AttributeConverter
映射 postgres-jsonb 列并发生以下情况:
情景一
当我将 postgresql-9.4-1206-jdbc4.jar
用作 provided
(在 pom.xml - 部署的应用程序中)时,我在尝试转换任何内容时遇到以下错误:
Caused by: java.lang.ClassNotFoundException: org.postgresql.util.PGobject from [Module "deployment.priject-1.0.1.ear.project.data-1.0.1-SNAPSHOT.jar:main" from Service Module Loader]
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:198)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:363)
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:351)
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:93)
... 269 more
场景 2
当我在默认范围内使用 postgresql-9.4-1206-jdbc4.jar
时,出现以下错误:
Caused by: java.lang.ClassCastException: org.postgresql.util.PGobject cannot be cast to org.postgresql.util.PGobject
at com.project.entity.util.converters.JSONBTypeConverter.convertToEntityAttribute(JSONBTypeConverter.java:33)
at com.project.entity.util.converters.JSONBTypeConverter.convertToEntityAttribute(JSONBTypeConverter.java:1)
at org.hibernate.type.descriptor.converter.AttributeConverterSqlTypeDescriptorAdapter.doConversion(AttributeConverterSqlTypeDescriptorAdapter.java:140)
... 266 more
这意味着:classloader 加载同一个 jar 两次,并且不能将此对象转换为自身。
问题:为什么 provided
依赖范围对手动添加(到 wildfly)的 postgres 驱动程序不起作用? (我想这就是我的解决方案)
您需要使用 jboss-deployment-structure.xml
将模块依赖项添加到您的部署中。
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="org.postgresql" />
</dependencies>
</deployment>
<sub-deployment name="project.data-1.0.1-SNAPSHOT.jar">
<dependencies>
<module name="org.postgresql" />
</dependencies>
</sub-deployment>
</jboss-deployment-structure>
请注意,可能不需要 EAR 上的模块依赖性。这仅取决于您的 EAR 的设置方式。
另一种选择是添加 Dependencies
manifest entry。由于您使用的是 Maven,因此您可以只使用 maven-jar-plugin
(因为它看起来是 EAR 中的 JAR)来创建条目。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<Dependencies>org.postgresql</Dependencies>
</manifestEntries>
</archive>
</configuration>
</plugin>
我在 Wildfly 10 中将 postgres jdbc 驱动程序配置为模块。我想做的是将该驱动程序用作将部署在服务器上的应用程序中的依赖项 - 所以在应用程序中,我将此依赖项标记为已提供(在 pom.xml 文件中),但它似乎不起作用。
当前配置:
在 wildfly-10.1.0.Final\modules\org\postgresql\main
添加了 Wildfly postgres 模块,其中有:postgresql-9.4-1206-jdbc4.jar
和 module.xml
,内容如下:
<module xmlns="urn:jboss:module:1.1" name="org.postgresql">
<resources>
<resource-root path="postgresql-9.4-1206-jdbc4.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>
模块用于定义数据源。至此,一切都运行良好 - 使用 hibernate 帮助表很高兴地映射到实体。除了一件事:
我开始使用 javax.persistence.AttributeConverter
映射 postgres-jsonb 列并发生以下情况:
情景一
当我将 postgresql-9.4-1206-jdbc4.jar
用作 provided
(在 pom.xml - 部署的应用程序中)时,我在尝试转换任何内容时遇到以下错误:
Caused by: java.lang.ClassNotFoundException: org.postgresql.util.PGobject from [Module "deployment.priject-1.0.1.ear.project.data-1.0.1-SNAPSHOT.jar:main" from Service Module Loader]
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:198)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:363)
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:351)
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:93)
... 269 more
场景 2
当我在默认范围内使用 postgresql-9.4-1206-jdbc4.jar
时,出现以下错误:
Caused by: java.lang.ClassCastException: org.postgresql.util.PGobject cannot be cast to org.postgresql.util.PGobject
at com.project.entity.util.converters.JSONBTypeConverter.convertToEntityAttribute(JSONBTypeConverter.java:33)
at com.project.entity.util.converters.JSONBTypeConverter.convertToEntityAttribute(JSONBTypeConverter.java:1)
at org.hibernate.type.descriptor.converter.AttributeConverterSqlTypeDescriptorAdapter.doConversion(AttributeConverterSqlTypeDescriptorAdapter.java:140)
... 266 more
这意味着:classloader 加载同一个 jar 两次,并且不能将此对象转换为自身。
问题:为什么 provided
依赖范围对手动添加(到 wildfly)的 postgres 驱动程序不起作用? (我想这就是我的解决方案)
您需要使用 jboss-deployment-structure.xml
将模块依赖项添加到您的部署中。
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="org.postgresql" />
</dependencies>
</deployment>
<sub-deployment name="project.data-1.0.1-SNAPSHOT.jar">
<dependencies>
<module name="org.postgresql" />
</dependencies>
</sub-deployment>
</jboss-deployment-structure>
请注意,可能不需要 EAR 上的模块依赖性。这仅取决于您的 EAR 的设置方式。
另一种选择是添加 Dependencies
manifest entry。由于您使用的是 Maven,因此您可以只使用 maven-jar-plugin
(因为它看起来是 EAR 中的 JAR)来创建条目。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<Dependencies>org.postgresql</Dependencies>
</manifestEntries>
</archive>
</configuration>
</plugin>