2017-08-15 89 views
1

我有一个提供商,我可以随时阅读实体,但我从来没有写过一些内容,直到我将@TransactionManagement(TransactionManagementType.CONTAINER)设置为课程级别,@Transactional覆盖了过滤方法。在JAX-RS ContainerResponseFilter中使用JTA事务,有任何副作用?

@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方法是突然的事务?通常事务仅用于服务方法,但在这里我使用的是提供程序,也许在后台有一些不同的行为会干扰我没有想过的事情?

+0

它可能会工作,但为什么不保持过滤器精益并将这些操作委托给服务层? –

+0

@CássioMazzochiMolin我已经想过了。我认为这的确是一种更好的风格。我将重要部分提取到服务中。 – Bevor

回答

0

它可能工作,但我不会那样做。

你的过滤器应保持这些操作应该是委托到服务层,它负责demarcating the transactions

相关问题