Immaginate di avere un filtro che avvia una transazione di database, elabora la richiesta e quindi tenta di eseguire il commit della transazione.È possibile eseguire il filtraggio servlet tradizionale con JAX-RS/Jersey?
doFilter(...) {
...
transaction.begin();
filterChain.doFilter(request, response);
transaction.commit();
}
Utilizzando Jersey, ci sono alcuni problemi:
- utilizzando un filtro, il Jersey Servlet Container impegna/svuota il risposta prima esecuzione torna al vostro filtro. Quindi, se il commit fallisce, non è possibile modificare il codice di ritorno in modo errato. Inoltre, eccezioni non verranno rilevate da un ExceptionMapper JAX-RS.
Utilizzo di ContainerRequestFilter/ContainerResponseFilter.
filtro ContainerRequest pubblico (richiesta ContainerRequest) { ...}
filtro ContainerResponse pubblico (richiesta ContainerRequest, risposta ContainerResponse) { ...}
Questo permette eccezioni a ribollire ad un ExceptionMapper, ma divide la logica su 2 metodi/interfacce separate. Il problema è che se c'è un'eccezione che non si associa a una risposta, ContainerResponseFilter non viene mai chiamato, quindi non è possibile eseguire la pulizia.
Qual è il modo migliore di gestirlo in un ambiente JAX-RS? C'è un modo per configurare lo svuotamento della risposta, o c'è una classe o un'interfaccia che sto trascurando?
Quello che descrivi è comunemente noto come il pattern "aperto in vista" (anti-). Vedi [questa domanda SO] (http://stackoverflow.com/q/1103363/131929) per una discussione. Passa anche a JBoss (Hibernate/Seam) per ulteriori discussioni, ad es. https://community.jboss.org/docs/DOC-13954 –
C'è sicuramente qualche discussione su cosa sia esattamente una "vista", ma questa è solo un'applicazione REST. I metodi di risorse jax-rs sono il livello di servizio e utilizzano direttamente la persistenza. L'oggetto risposta è il risultato della chiamata di servizio. Sto cercando di evitare di avere la gestione delle transazioni in ogni metodo, e la risposta è qualcosa che assomiglia a un filtro, o collego l'intercettazione CDI (che vorrei evitare a questo punto del progetto, se posso). – Shaun