Wyobraź sobie, że masz filtr, który uruchamia transakcję bazy danych, przetwarza żądanie, a następnie próbuje zatwierdzić transakcję.Czy możesz wykonywać tradycyjne filtrowanie serwletów za pomocą JAX-RS/Jersey?
doFilter(...) {
...
transaction.begin();
filterChain.doFilter(request, response);
transaction.commit();
}
Korzystanie Jersey, istnieją pewne problemy:
- stosując filtr, Jersey Servlet Container zobowiązuje/wypłukuje odpowiedź przed wykonaniem powraca do filtra. Tak więc, jeśli zatwierdzenie nie powiedzie się, nie można zmodyfikować kodu powrotu, aby był niepowodzeniem. Ponadto wyjątki nie zostaną przechwycone przez ExceptionMapper JAX-RS.
Korzystanie z ContainerRequestFilter/ContainerResponseFilter.
filtr ContainerRequest publicznych (ContainerRequest request) { ... }
publicznego filtr ContainerResponse (ContainerRequest wniosek, odpowiedź ContainerResponse) { ... }
Pozwala to wyjątki wypłynąć do ExceptionMapper, ale dzieli logikę na 2 osobne metody/interfejsy. Problem polega na tym, że jeśli istnieje wyjątek, który nie jest odwzorowany na odpowiedź, właściwość ContainerResponseFilter nigdy nie jest wywoływana, więc nie można jej wyczyścić.
Jaki jest preferowany sposób postępowania w środowisku JAX-RS? Czy istnieje sposób na skonfigurowanie płukania odpowiedzi lub czy istnieje klasa lub interfejs, z którego przeglądam?
To, co opisujesz, jest powszechnie znane jako "wzorzec otwartej sesji" (anty). Zobacz [to pytanie SO] (http://stackoverflow.com/q/1103363/131929) do dyskusji. Zwróć się także do JBoss (Hibernate/Seam), aby uzyskać więcej dyskusji, np. https://community.jboss.org/docs/DOC-13954 –
Istnieje pewna debata na temat tego, czym dokładnie jest "widok", ale jest to po prostu aplikacja REST. Metody zasobów jax-rs są warstwą usługi i bezpośrednio wykorzystują funkcję utrwalania. Obiekt odpowiedzi jest wynikiem wywołania usługi. Próbuję uniknąć zarządzania transakcjami w każdej metodzie, a odpowiedź jest albo czymś podobnym do filtra, albo podłączam do przechwytywania CDI (którego chciałbym uniknąć w tym momencie w projekcie, jeśli mogę). – Shaun