2013-11-11 6 views
2

У меня есть сервак java ee 7 с аннотацией webservlet. Я отметил, что одним из методов сервлета является @Transactional. Администратор сущности также предоставляется сервлету с контекстом персистентности.java ee 7 @Transactional по методу сервлета

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

Этот метод вызывается из сервлета при обработке запроса HTTP. glassfish4 бросает исключение, говоря, что транзакции нет.

Я определил простой управляемый CDI-компонент с помощью метода и добавил в него @Transactional-аннотацию и инстанцию ​​менеджера сущностей.

Я ввел этот объект в сервлет и вызвал метод из сервлета, и все работает нормально. em вводится в CDI-компонент, инициируется транзакция и em.persist работает нормально.

Означает ли это, что объект сервлета не может иметь @Transactional аннотацию по своим методам?

+0

Я не уверен, может быть, сервлеты не могут быть проксимированы. –

+2

Правильно, более или менее. Транзакция определена для использования CDI и EJB. я не думаю, что он будет работать с управляемыми фанами Faces, сервлетами и т. д. –

ответ

0

Я пробовал это с помощью тома Томео 7.0.4. Он не генерирует исключение, но в моих тестах никаких фиксаций и отката не произошло.

Заключение заключается в том, что @Transactional не работает в @WebServlet.

Редактировать: В этих тестах @Transactional был на уровне метода. Кажется, он работает на уровне класса, см. Ответ @ Rouliboy.

+0

Что касается javadoc 'Аннотации javax.transaction.Transactional предоставляют приложению возможность декларативно контролировать границы транзакций ** на управляемых бинами CDI, а также классы, определенные как управляемые компоненты по спецификации Java EE **. Поэтому он должен работать на '@ WebServlet', поскольку это управляемый компонент. Я дам попробовать на wildfly и weblogic. – Rouliboy

+0

См. Также: он также не работает с JSF-управляемыми CDI-компонентами в TomEE 7. Сообщите нам, если вы видите разные результаты. –

+1

Я тестировал его на Wildfly, и он работает, когда @Transactional установлен на уровне класса. Он не работает, если он установлен на уровне метода. – Rouliboy

2

мне удалось сделать @Transactional работу с @WebServlet и КДИ на Wildfly 10, но только тогда, когда @Transactional устанавливается на уровне класса. Он не работает, если он установлен на уровне метода.

Так следующий пример работает отлично:

@Transactional 
@WebServlet("/transactional") 
public class TransactionalServlet extends HttpServlet 
{ 
    /** The entity Manager */ 
    @Inject 
    @AppStoreDatabase 
    private EntityManager m_entityManager; 

    @Override 
    public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws IOException 
    { 
     final Person person = new Person(); 
     person.setFirstName("FirstName"); 
     person.setLastName("LastName"); 

     m_entityManager.persist(person); 

     response.getWriter().println("OK"); 
    } 
} 

Хотя аннотирования только метод делает НЕ работы:

@Transactional // Throws a TransactionRequiredException! 
    @Override 
    public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws IOException 
    { 
     final Person person = new Person(); 
     person.setFirstName("FirstName"); 
     person.setLastName("LastName"); 

     m_entityManager.persist(person); 

     response.getWriter().println("OK"); 
    } 

Я расследование.

+0

Тот же результат с томером Томее 7.0.4 с использованием бина CDI, обработанного сеансом, в приложении JSF. –

Смежные вопросы