Каковы ограничения @Transactional в CDI? - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь использовать метод @Transactional внутри класса CDI вместо EJB:

@javax.inject.Named
// fails @javax.enterprise.context.ApplicationScoped
// fails @javax.enterprise.context.SessionScoped
// works @javax.ejb.Singleton
// works @javax.ejb.Stateless
public class SomeClass {
    @javax.persistence.PersistenceContext
    private EntityManager em;

    @javax.annotation.PostConstruct    
    @javax.transaction.Transactional
    public void someMethod() {
        em.persist(someEntity);
    }
}

Когда я аннотирую SomeClass с помощью @Singleton или @Stateless, все работает.

Когда я аннотирую SomeClass с помощью @ApplicationScoped или @SessionScoped, WildFly 13 отображает следующее сообщение об ошибке:

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

У меня сложилось впечатление, что @Transactional работает с CDI начиная с Java EE 7. Я ошибся?Или мне просто не хватает какой-то дополнительной конфигурации?

1 Ответ

0 голосов
/ 08 июня 2018

Я попытаюсь дать краткий список вещей, которые нужно посмотреть, чтобы заставить @Transactional работать с CDI, чтобы придать ответу немного большую ценность, чем комментарий:

  1. Мы обсуждаем javax.transaction.Transactional, а не javax.ejb.TransactionAttribute, который работает для EJB!
  2. Он НЕ работает "из коробки" в не-JEE-приложениях!
  3. И в приложениях JEEмы имеем в виду тех, кто использует полный сервер приложений JEE;Tomcat "из коробки" НЕ поддерживает это!
  4. Остерегайтесь проблем с classpath, в частности, убедитесь, что нет файла jar с аннотацией javax.transaction.Transactional, например, в WEB-INF / lib.
  5. @Transactional реализован как перехватчик CDI в соответствии с последними спецификациями JTA.Таким образом:
    • Его нет в JEE <7! </li>
    • . У него те же ограничения, что и у любого перехватчика.Например, он не может быть вызван для методов инициализатора - @PostConstruct [ЭТО БЫЛО ПРОБЛЕМА В ЭТОМ ВОПРОСЕ], и он НЕ активируется при вызове методов объекта this, ВНИМАНИЕ !!!
  6. Я вполне уверен, что может существовать больше ошибок !!!
...