postgresql - Wildfly Postgres JDBC 模块问题

标签 postgresql maven jdbc scope wildfly-10

我在 Wildfly 10 中将 postgres jdbc 驱动程序配置为模块。我想做的是将该驱动程序用作将部署在服务器上的应用程序中的依赖项 - 因此在应用程序中,我将此依赖项标记为已提供(在 pom.xml 文件中),但它似乎不起作用。

当前配置:

wildfly-10.1.0.Final\modules\org\postgresql\main 添加了 Wildfly postgres 模块,其中有:postgresql-9.4-1206-jdbc4.jarmodule.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$2.doConversion(AttributeConverterSqlTypeDescriptorAdapter.java:140)
    ... 266 more

这意味着:类加载器加载同一个 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>

关于postgresql - Wildfly Postgres JDBC 模块问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41931976/

相关文章:

java - org.springframework.jdbc.core.JdbcOperations.query(PreparedStatementCreator, ResultSetExtractor) 是否有可能返回封闭的 RowSet?

java - 带有 QueryDSL 的 Postgresql 数组函数

postgresql - postgresql 服务器启动时,postgresql 中是否有任何系统表自动更新?

使用 Maven 打包 JAR 和 WAR 的 Spring Boot 迁移问题

maven - 在windows中使用docker设置redis配置

sql-server - Solr DataImportHandler 与 SQL Server

mysql - 如何使用jsp从数据库中删除选定的数据?

sql - 在表上插入或更新违反外键约束

SQL - 如何根据条件插入到表中?

java - 如何在 java junit 测试类中并行运行一些测试用例并以串行方式运行一些测试用例?