在Wildfly 18中为@DataSourceDefinition密码使用操作系统变量失败



我想使用操作系统变量${appuserpwd}外部化Java@DataSourceDefinition的密码。下面是我的@DataSourceDefinition

@DataSourceDefinition(
name = "java:app/jdbc/mydb", 
className = "com.mysql.cj.jdbc.MysqlConnectionPoolDataSource", 
portNumber = 3306, 
serverName = "localhost", 
databaseName = "mydb", 
user = "appuser", 
password = "${appuserpwd}", 
isolationLevel = Connection.TRANSACTION_READ_COMMITTED, 
properties = {})

我正在使用Wildfly 18。在子系统ee中,我已经打开了这些属性:

Annotation Property Replacement:  ON
JBoss Descriptor Property Replacement:  ON
Spec Descriptor Property Replacement:  ON

我总是得到一个异常错误如下:

Caused by: java.sql.SQLException: Access denied for user 'appuser'@'localhost' (using password: YES)

这意味着Wildfly未能将${appuserpwd}转换为名为appuserpwd的操作系统环境中的真实密码。

我已尝试${env.appuserpwd}获取@DataSourceDefinition密码,但收到了相同的消息。

如果我将${appuserpwd}替换为appuser真实密码->该应用程序运行正常,没有问题。

有什么帮助吗?谢谢

有一个Java EE 7规范建议支持密码别名,但它从未纳入规范。因此,没有办法以标准可移植(在每个符合Java EE的服务器上工作(的方式替换变量。

幸运的是,不同的应用程序服务器提供了自己的解决方案来实现这一点。

对于Wildfly,您必须首先在standalone.xml:中启用注释属性替换

<subsystem xmlns="urn:jboss:domain:ee:5.0">
<annotation-property-replacement>true</annotation-property-replacement>
</subsystem>

现在您可以开始替换变量(语法为${ENV_VARIABLE:default}(:

@DataSourceDefinition(
name = "java:app/jdbc/pqsql",
className = "org.postgresql.xa.PGXADataSource",
user = "${DB_USER:postgres}",
password = "${DB_PASSWORD:password}",
serverName = "${DB_SERVERNAME:localhost}",
portNumber = 5432,
databaseName = "${DB_DATABASENAME:testdatabase}")

你可以在这里找到更多信息。

UPDATE:我在最近的Wildfly版本(20.0.0.Final(中尝试过这一点,在替换注释变量时似乎有一个错误。作为后备,您可以使用传统的方式,使用Jboss CLI指定数据源,并按预期使用环境变量:

# First create the new module for the JDBC driver
/subsystem=datasources/jdbc-driver=postgresql:add(driver-name=postgresql, driver-module-name=org.postgresql, driver-class-name=org.postgresql.Driver, driver-datasource-class-name=org.postgresql.ds.PGPoolingDataSource)

# Create a data source
/subsystem=datasources/data-source=PostgresDS:add(jndi-name=java:jboss/datasources/postgres, driver-name=postgresql, connection-url=jdbc:postgresl://localhost:5432/postgres, user-name=postgres, password=postgres)

最新更新