2017-08-15 4 views
1

Ich habe einen Anbieter, wo ich immer Entitäten lesen kann, aber ich habe nie geschrieben, bis ich die @TransactionManagement(TransactionManagementType.CONTAINER) auf Klassenebene und die @Transactional auf die überschriebene Filtermethode gesetzt habe.Mit JTA-Transaktion in JAX-RS ContainerResponseFilter, irgendwelche Nebenwirkungen?

@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); 
    } 
} 

Meine Frage ist: Gibt es vielleicht irgendwelche Nebenwirkungen, wenn die filter Methode plötzlich Transaktions ist? Normalerweise werden Transaktionen nur in Service-Methoden verwendet, aber hier benutze ich einen Provider, vielleicht gibt es ein anderes Verhalten im Hintergrund, was Dinge stören könnte, über die ich noch nicht nachgedacht habe?

+0

Es funktioniert vielleicht, aber warum halten Sie Ihren Filter nicht schlank und delegieren diese Operationen an eine Serviceschicht? –

+0

@ CássioMazzochiMolin Ich habe schon darüber nachgedacht. Ich denke, es ist in der Tat ein besserer Stil. Ich habe die wichtigen Teile zu einem Service extrahiert. – Bevor

Antwort

0

Es kann funktionieren, aber ich würde das nicht tun.

Ihre Filter sollte schlanke und diese Operationen sollten auf der Dienstschicht übertragen werden gehalten werden, was für demarcating the transactions verantwortlich ist.

Verwandte Themen