EJB с CMT при переходе с JBoss 7 на WildFly 9 - PullRequest
0 голосов
/ 23 мая 2018

Я переношу свое приложение из JBoss 7 в WildFly (v9.0.1), и оно не развернуто из-за ошибки управления транзакциями компонента.

    Caused by: javax.naming.NamingException: WFLYNAM0062: Failed to lookup env/com.component.eventmgt.EventServiceImpl/transaction [Root exception is java.lang.RuntimeException: WFLYNAM0059: Resource lookup for injection failed: java:jboss/UserTransaction]
    at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:157)
    at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:83)
    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:207)
    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:193)
    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:189)
    at org.jboss.as.naming.deployment.ContextNames$BindInfo$1$1.getReference(ContextNames.java:316)
    ... 90 more
Caused by: java.lang.RuntimeException: WFLYNAM0059: Resource lookup for injection failed: java:jboss/UserTransaction
    at org.jboss.as.naming.deployment.ContextNames$BindInfo$1$1.getReference(ContextNames.java:319)
    at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:143)
    ... 95 more
Caused by: javax.naming.NameNotFoundException: UserTransaction [Root exception is java.lang.IllegalStateException: WFLYEJB0137: Only session and message-driven beans with bean-managed transaction demarcation are allowed to access UserTransaction]
    at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:153)
    at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:83)
    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:207)
    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:193)
    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:189)
    at org.jboss.as.naming.deployment.ContextNames$BindInfo$1$1.getReference(ContextNames.java:316)
    ... 96 more

Вот класс EventServiceImpl.

    @Stateless
    @Remote(EventService.class)
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public class EventServiceImpl implements EventService {

        /**
         * Logger
         */
        private static Logger log = LoggerFactory.getLogger(EventService.class);

        private EventTableDAO eventDao;

        @PersistenceContext(unitName = "SOMF-GT")
        private EntityManager entityManager;

        @Resource
        private UserTransaction transaction;

       public List<Map> loadEvents() throws EventsException {

        Configuration configurationEntry = new Configuration();
        try {
            Map configuration = configurationService.getConfiguration();
            if (configuration != null) {

        eventDao = new EventTableDAO(Event.class, entityManager, transaction);
        List<Map> eventsMapList = new ArrayList();
}
}

Я знаю, что если я изменил управление транзакциями на BMT с помощью @TransactionManagement (TransactionManagementType.BEAN), но тогда появляется следующая ошибка

WFLYJPA0060: Для выполнения этой операции требуется транзакция (либоиспользовать транзакцию или расширенный контекст постоянства)

Я хочу знать, почему мы должны изменить это в первую очередь?

Любая информация, пожалуйста!

1 Ответ

0 голосов
/ 11 декабря 2018

Эти изменения были внедрены в Wildfly 8 и были (как отмечено ниже) основаны на стандартизации глобального пространства имен JNDI в EJB 3.1.

Из Wildfly 8 Руководство разработчика :

EJB 3.1 представил стандартизированное глобальное пространство имен JNDI и ряд связанных пространств имен, которые отображаются в различные области приложения Java EE.Для переносимых поисков JNDI используются три пространства имен JNDI: java: global, java: module и java: app.Если вы используете поиски JNDI в своем приложении, вам нужно будет изменить их в соответствии с новым стандартизированным соглашением о пространстве имен JNDI.

Чтобы соответствовать новым правилам пространства переносимых имен JNDI, вам необходимо просмотреть правила пространства имен JNDI иизмените код приложения, следуя этим правилам.

Руководство также отмечает:

WildFly 8 ужесточил имена пространств имен JNDI, чтобы обеспечить предсказуемые и согласованные правила для каждого именипривязать к серверу приложений и предотвратить будущие проблемы совместимости.Это означает, что у вас могут возникнуть проблемы с текущими пространствами имен в вашем приложении, если они не следуют новым правилам.

Вот фрагмент из таблицы, показывающий Примеры отображений JNDI в предыдущих выпускахи как они могут выглядеть сейчас , специфичные для UserTransaction:

Previous Namespace          New Namespaces
------------------          --------------
java:comp/UserTransaction   java:comp/UserTransaction (This will not be accessible for non EE threads, e.g. Threads your application directly creates)
java:comp/UserTransaction   java:jboss/UserTransaction (Globally accessible, use this if java:comp/UserTransaction is not available)

Редактировать re: WFLYEJB0137:

Это теоретическое ремесло и может бытьничего не стоит - дайте мне знать, и я его удалю. Учебное пособие по Java EE 6 - Управляемые контейнером транзакции говорит:

Корпоративные компоненты, использующие разграничение управляемых контейнером транзакций, также не должны использовать интерфейс javax.transaction.UserTransaction.

Далее:

(Транзакция) Обязательно Атрибут

Если клиент работает в транзакции и вызывает метод корпоративного компонента,Метод выполняется в рамках транзакции клиента.Если клиент не связан с транзакцией, контейнер запускает новую транзакцию перед запуском метода.

Атрибут Required является неявным атрибутом транзакции для всех методов корпоративного компонента, работающих с разграничением транзакций, управляемым контейнером.. Обычно вы не устанавливаете атрибут Required, если вам не нужно переопределять другой атрибут транзакции.Поскольку атрибуты транзакции являются декларативными, вы можете легко изменить их позже.

Сообщение об исключении в значительной степени говорит само за себя:

WFLYEJB0137: Только сессионные и управляемые сообщениями компоненты сРазграничению управляемых компонентом транзакций разрешен доступ к UserTransaction

Ваш EJB использует разграничение управляемой контейнером транзакции (CMT), которое не взаимодействует с разграничением управляемой компонентом (BMT), в котором лежит UserTransaction.

Относительно переключения на BMT и

WFLYJPA0060: для выполнения этой операции требуется транзакция (либо использовать транзакцию, либо расширенный контекст постоянства)

Iнайдено Для выполнения этой операции требуется транзакция (либо использовать транзакцию, либо расширенный контекст постоянства) , что, по-видимому, указывает на то, что вы управляете транзакцией, как вы отметили в своих комментариях @Marco.Похоже, что вы сделали соответствующую модификацию.

...