【问题标题】:Using JTA transaction in JAX-RS ContainerResponseFilter, any side effects?在 JAX-RS ContainerResponseFilter 中使用 JTA 事务,有什么副作用吗?
【发布时间】:2017-08-15 10:27:29
【问题描述】:

我有一个提供程序,我总是可以读取实体,但我从来没有写过一些,直到我在类级别设置 @TransactionManagement(TransactionManagementType.CONTAINER) 并在覆盖的过滤器方法上设置 @Transactional

@Provider
@Priority(value = 1)
@TransactionManagement(TransactionManagementType.CONTAINER)
public class SecurityUsageResponseFilter implements ContainerResponseFilter
{
    @PersistenceContext(unitName = "MyAppPersistenceUnit")
    private EntityManager entityManager;

    @Override
    @Transactional
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException
    {
        //code

        updateUserAndHeaderInformation(id, responseContext);

        //code
    }

    private void updateUserAndHeaderInformation(Object userId, ContainerResponseContext responseContext)
    {
        //This ALWAYS work
        RestrictedUsers user = entityManager.find(RestrictedUsers.class, userId);

        //Only works when transactions are explicitly set
        user.setLastTransferToken(newTransferToken);
        user.setLastObfuscationId(newObfuscationId);
    }
}

我的问题是:当filter 方法突然变成事务性时,是否有任何副作用?通常事务只在服务方法中使用,但在这里我使用的是提供者,可能在后台有一些不同的行为可能会干扰我还没有想到的事情?

【问题讨论】:

  • 它可能有效,但您为什么不保持过滤器精简并将这些操作委托给服务层?
  • @CássioMazzochiMolin 我已经考虑过了。我认为这确实是一种更好的风格。我将重要部分提取到服务中。

标签: java jax-rs jta transactional


【解决方案1】:

它可能有效,但我不会那样做。

您的过滤器应该保持精益,并且这些操作应该委派到负责demarcating the transactions的服务层。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    相关资源
    最近更新 更多