在 JAX-RS ContainerResponseFilter 中使用 JTA 事务,有什么副作用吗?
Using JTA transaction in JAX-RS ContainerResponseFilter, any side effects?
我有一个提供程序,在那里我总是可以读取实体,但我从来没有写过一些,直到我在 class 级别上设置 @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
方法突然变成事务性时,是否可能有任何副作用?通常事务仅在服务方法中使用,但在这里我使用的是提供程序,可能在后台有一些不同的行为可能会干扰我还没有考虑过的事情?
它可能有用,但我不会那样做。
您的过滤器应保持精简并且这些操作应委托到服务层,该层负责demarcating the transactions.
我有一个提供程序,在那里我总是可以读取实体,但我从来没有写过一些,直到我在 class 级别上设置 @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
方法突然变成事务性时,是否可能有任何副作用?通常事务仅在服务方法中使用,但在这里我使用的是提供程序,可能在后台有一些不同的行为可能会干扰我还没有考虑过的事情?
它可能有用,但我不会那样做。
您的过滤器应保持精简并且这些操作应委托到服务层,该层负责demarcating the transactions.