Не удалось использовать системную переменную ОС для пароля @DataSourceDefinition в Wildfly 18 - PullRequest
1 голос
/ 10 июля 2020

Я хочу использовать внешний пароль для Java @DataSourceDefinition, используя системную переменную ОС $ {appuserpwd} . Ниже приведен мой @ 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} реальным паролем пользователя приложения -> Приложение работает нормально, никаких проблем.

Есть помощь? Спасибо!

1 Ответ

1 голос
/ 10 июля 2020

Было предложение Java EE 7 spe c о поддержке псевдонима пароля , но оно так и не вошло в спецификацию. Поэтому нет возможности заменить переменные в стандартном и портативном (работающем на каждом 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)
...