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