Работает ли CDI @Transactional REQUIRES_NEW в локальных методах

Работает ли CDI @Transactional(Transactional.TxType.REQUIRES_NEW), когда вызывается внутри одного и того же компонента:

@Transactional
public void method1() {
    for(...) {
        method2();
    }
}

@Transactional(Transactional.TxType.REQUIRES_NEW)
public void method2() {
   ...
}

Я предполагаю, что это не работает, потому что локальные звонки не могут быть перехвачены прокси. В этом случае, каков рекомендуемый шаблон использования, если я хочу управлять каждым вызовом метода2 в новой транзакции. Очевидным является создание еще одного bean-компонента, но мне это не нравится.


person lujop    schedule 21.03.2015    source источник
comment
Если вы можете использовать EJB для своих контроллеров вместо CDI, вам будет лучше на этом этапе. Компоненты EJB такие же простые, более зрелые и не имеют таких проблем, как невозможность ссылаться на себя или вызывать локальные методы. С помощью EJB вы можете либо внедрить ссылку на тот же компонент, либо использовать контекст сеанса EJB для вызова локального метода.   -  person NBW    schedule 21.03.2015
comment
@NBW Но проблема с локальными методами такая же, не так ли? Решение будет заключаться в том, чтобы получить интерфейс Business и вызвать локальный метод?   -  person lujop    schedule 22.03.2015
comment
Интересно, почему вы на самом деле хотите открыть еще одну транзакцию? Я не вижу try/catch в вашем method1 Что произойдет, если одна из method2 транзакций завершится неудачно? Транзакция вокруг method1 действительно все еще действительна? Обычно транзакции дают вам семантику «все или ничего», и с вашим приведенным выше фрагментом кода я изо всех сил пытаюсь увидеть преимущество вложенной транзакции. FWIW, согласно SRP, вы, скорее всего, все еще хотите переместить method2 в другой компонент, в частности, если его значение/вариант использования даже оправдывает новую транзакцию.   -  person Alexander Langer    schedule 22.03.2015


Ответы (1)


Перехват вызовов локальных методов не работает для CDI, и вы не можете внедрить свой класс непосредственно в себя (циклическая зависимость). См. также аннотированный метод перехватчика вызова CDI в одном экземпляре

Проблема с самоинъекцией все еще остается открытой, см. https://issues.jboss.org/browse/CDI-414

person mp911de    schedule 21.03.2015