Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
servlet方法上的JavaEE7@Transactional_Java_Cdi_Java Ee 7 - Fatal编程技术网

servlet方法上的JavaEE7@Transactional

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

我有一个带有webservlet注释的JavaEE7servlet。我已经将servlet的一个方法标记为@Transactional。还为servlet提供了一个实体管理器和一个持久性上下文

该方法只使用注入的实体管理器并持久化作为参数传入的实体

在处理http请求时从servlet调用此方法。glassfish4抛出一个异常,表示没有可用的事务

我使用该方法定义了一个简单的托管CDIBean,并在其上注入了@Transactional注释和实体管理器

我将该对象注入servlet并从servlet调用该方法,一切正常。em被注入cdibean,事务启动,em.persist工作正常


这是否意味着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的结果相同。