Причина в том, что по умолчанию используется управление транзакциями на уровне контейнера (CMT), а аттрибут транзакции - REQUIRES_NEW. Получается, что getContextName вызывался в рамках транзакции новой транзакции, но при это объект factory.getConnection() не поддерживал транзакции. Решение на данный момент было простым - добавил аннотацию @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) для метода, чтобы изменить аттрибут транзакции.
@Stateless
public class TestingEJB implements Testing {
@Resource(name = "LocalSettingsFactory", mappedName = "java:LocalSettingsFactory")
private LocalSettingsFactory factory;
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public String getContextName() {
try {
return factory.getConnection().getContextName();
} catch (NamingException e) {
return e.getMessage();
}
}
}
Насколько я понял, подобные проблемы могут быть и с DataSource-ами, которые используются некорректно (например, сконфигурованы для локальных транзакций, а используются в рамках XA-транзакций).
Комментариев нет:
Отправить комментарий