servlet方法上的JavaEE7@Transactional
我有一个带有webservlet注释的JavaEE7servlet。我已经将servlet的一个方法标记为@Transactional。还为servlet提供了一个实体管理器和一个持久性上下文 该方法只使用注入的实体管理器并持久化作为参数传入的实体 在处理http请求时从servlet调用此方法。glassfish4抛出一个异常,表示没有可用的事务 我使用该方法定义了一个简单的托管CDIBean,并在其上注入了@Transactional注释和实体管理器 我将该对象注入servlet并从servlet调用该方法,一切正常。em被注入cdibean,事务启动,em.persist工作正常servlet方法上的JavaEE7@Transactional,java,cdi,java-ee-7,Java,Cdi,Java Ee 7,我有一个带有webservlet注释的JavaEE7servlet。我已经将servlet的一个方法标记为@Transactional。还为servlet提供了一个实体管理器和一个持久性上下文 该方法只使用注入的实体管理器并持久化作为参数传入的实体 在处理http请求时从servlet调用此方法。glassfish4抛出一个异常,表示没有可用的事务 我使用该方法定义了一个简单的托管CDIBean,并在其上注入了@Transactional注释和实体管理器 我将该对象注入servlet并从serv
这是否意味着servlet对象的方法上不能有@Transactional注释?我在TomEE plume 7.0.4中尝试过这一点。它不会抛出异常,但在我的测试中没有发生提交或回滚 结论是
@Transactional
在@WebServlet
中不起作用
Edit:在这些测试中,
@Transactional
处于方法级别。它似乎在类级别工作,请参见@Rouliboy的答案。我设法使@Transactional
与@WebServlet
和Wildfly 10上的CDI一起工作,但仅当@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");
}
我会调查。我不确定,可能是servlet无法代理。正确,或多或少。事务是为CDI和EJB使用而定义的。我认为它不适用于Faces托管bean、servlet等。关于javadoc
javax.transaction.Transactional注释为应用程序提供了在CDI托管bean上声明控制事务边界的能力,以及Java EE规范定义为托管bean的类。因此它应该在@WebServlet
上工作,因为它是一个托管bean。我将尝试一下wildfly和weblogic。相关:在Tomee7中,它在JSF管理的CDIBeans上也不起作用。如果您看到不同的结果,请告诉我们。我在Wildfly上测试了它,当@Transactional设置为类级别时,它就会工作。当它设置在方法级别时,它不起作用。在JSF应用程序中使用会话范围的CDIBean时,TomEE 7.0.4的结果相同。