2017-08-15 3 views
1

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é?

+0

Cela peut fonctionner, mais pourquoi ne conservez-vous pas votre filtre et déléguez-vous ces opérations à une couche de service? –

+0

@ 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

Répondre

0

Cela peut fonctionner mais je ne le ferais pas.

Votre filtre doit être maintenu maigre et ces opérations devraient être à la déléguée couche de service, qui est responsable de demarcating the transactions.