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
方法是突然的事務?通常事務僅用於服務方法,但在這裏我使用的是提供程序,也許在後臺有一些不同的行爲會干擾我沒有想過的事情?
它可能會工作,但爲什麼不保持過濾器精益並將這些操作委託給服務層? –
@CássioMazzochiMolin我已經想過了。我認爲這的確是一種更好的風格。我將重要部分提取到服務中。 – Bevor