gpt4 book ai didi

servlet 方法上的 java ee 7 @Transactional

转载 作者:行者123 更新时间:2023-11-30 09:15:24 24 4
gpt4 key购买 nike

我有一个带有 webservlet 注释的 java ee 7 servlet。我已将 servlet 的方法之一标记为 @Transactional。实体管理器还提供给具有持久性上下文的 servlet。

该方法仅使用注入(inject)的实体管理器并保留作为参数传入的实体。

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

我使用该方法定义了一个简单的托管 CDI bean,并在其上添加了 @Transactional 注释并注入(inject)了实体管理器。

我将该对象注入(inject)到 servlet 并从 servlet 调用该方法,一切正常。 em 被注入(inject)到 CDI bean,事务启动并且 em.persist 工作正常。

这是否意味着 servlet 对象不能在其方法上使用@Transactional 注释?

最佳答案

我设法使 @Transactional 在 Wildfly 10 上与 @WebServlet 和 CDI 一起工作,但仅当 @Transactional 设置为类(class)水平。在方法级别设置时不起作用。

所以下面的例子工作正常:

@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");
}
}

虽然仅注释方法NOT 起作用:

   @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 方法上的 java ee 7 @Transactional,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19915018/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com