1

我想使用操作系统系统变量${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 密码,但我得到了同样的信息。

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

有什么帮助吗?谢谢!

4

1 回答 1

1

有一个 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}")

您可以在此处找到更多信息。

更新:我用最近的 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)
于 2020-07-10T06:05:35.783 回答