J'ai un fournisseur où je peux toujours lire Entités mais je n'écrirais jamais jusqu'à ce que je mette le @TransactionManagement(TransactionManagementType.CONTAINER)
au niveau de la classe et le @Transactional
sur la méthode de filtre substituée.Utilisation de la transaction JTA dans JAX-RS ContainerResponseFilter, des effets secondaires?
@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);
}
}
Ma question est: Y at-il peut-être des effets secondaires lorsque la méthode filter
est soudainement transactionnel? Habituellement, les transactions ne sont utilisées que dans les méthodes de service, mais ici, j'utilise un fournisseur, peut-être y at-il un comportement différent en arrière-plan qui pourrait interférer avec des choses auxquelles je n'avais pas encore pensé?
Cela peut fonctionner, mais pourquoi ne conservez-vous pas votre filtre et déléguez-vous ces opérations à une couche de service? –
@ CássioMazzochiMolin J'ai déjà pensé à ça. Je pense que c'est en effet un meilleur style. J'ai extrait les parties importantes d'un service. – Bevor