пятница, 12 февраля 2010 г.

Could not enlist in transaction on entering meta-aware object

Словил это исключение. Решение было быстрым и простым. Самописный ResourceAdapter, который я использовал, не поддерживал работу с транзакциями. LocalSettingsFactory инжектировался корректно, но при попытке выполнить метод getContextName() у EJB-бина выскакивало это исключение.
Причина в том, что по умолчанию используется управление транзакциями на уровне контейнера (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-транзакций).

Комментариев нет:

Отправить комментарий