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?
Es funktioniert vielleicht, aber warum halten Sie Ihren Filter nicht schlank und delegieren diese Operationen an eine Serviceschicht? –
@ 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