Настройка интегрированной безопасности для подключений XA на JBoss
Если для параметра IntegratedSecurity в источнике данных XA на JBoss установлено значение true, драйвер JDBC от Microsoft не разрешает настройку "true" в логическое значение, а выдает ошибку:
java.lang.NoSuchMethodException:
com.microsoft.sqlserver.jdbc.SQLServerXADataSource.setIntegratedSecurity(java.lang.String)
Это проблема только при использовании источника данных XA, источники данных не XA обычно работают с интегрированной защитой.
Есть ли другой способ установить интегрированную защиту для соединений XA на JBoss или способ сказать ему, чтобы он отправлял логическое значение при установке свойства xa-datasource-property?
Чтобы воспроизвести это поведение:
a) В конфигурации JBoss AS \standalone\standalone.xml добавьте новый источник данных xa-данных в JNDI:
<xa-datasource jta="true" jndi-name="java:jboss/datasources/jndiName" pool-name="poolName" enabled="true" use-java-context="true" use-ccm="true">
<xa-datasource-property name="ServerName">
localhost
</xa-datasource-property>
<xa-datasource-property name="DatabaseName">
MyDbName
</xa-datasource-property>
<xa-datasource-property name="SelectMethod">
cursor
</xa-datasource-property>
<!-- this should work but doesn't -->
<xa-datasource-property name="IntegratedSecurity">
true
</xa-datasource-property>
<xa-datasource-class>com.microsoft.sqlserver.jdbc.SQLServerXADataSource</xa-datasource-class>
<driver>sqljdbc</driver>
<xa-pool>
<is-same-rm-override>false</is-same-rm-override>
</xa-pool>
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker"/>
</validation>
</xa-datasource>
б) Перезапустите JBoss AS
c) Попробуйте выполнить запрос, используя настроенное соединение JNDI:
InitialContext ic = new InitialContext();
DataSource ds = (DataSource) ic.lookup("java:jboss/datasources/jndiName");
Connection conn = null;
try {
conn = ds.getConnection();
// try to execute something
CallableStatement stmt = conn.prepareCall("{? = call some_stored_procedure()}");
stmt.execute();
} finally {
if (conn != null)
conn.close();
}
Выполнение этого кода приведет к исключению, заявляющему:
java.lang.NoSuchMethodException:
com.microsoft.sqlserver.jdbc.SQLServerXADataSource.setIntegratedSecurity(java.lang.String)
1 ответ
Я также столкнулся с этим, но я смог заставить это работать, если я использую URL-адрес xa-datasource-property.
Пример:
<xa-datasource-property name="URL">jdbc:sqlserver://<host>:<port>;database=<db>;integratedSecurity=true</xa-datasource-property>
Эти фрагменты должны быть удалены:
<xa-datasource-property name="ServerName">
localhost
</xa-datasource-property>
<xa-datasource-property name="DatabaseName">
MyDbName
</xa-datasource-property>
<xa-datasource-property name="SelectMethod">
cursor
</xa-datasource-property>
<!-- this should work but doesn't -->
<xa-datasource-property name="IntegratedSecurity">
true
</xa-datasource-property>