2017-08-15 79 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