Veritabanı işlemi başlatan, isteği işleyen ve ardından işlemi gerçekleştirmeye çalışan bir filtreniz olduğunu düşünün. Bazı sorunlar var Jersey kullanmaJAX-RS/Jersey ile geleneksel Servlet Filtreleme yapabilir misiniz?
doFilter(...) {
...
transaction.begin();
filterChain.doFilter(request, response);
transaction.commit();
}
:
- Filtre kullanarak, Jersey Servlet Container taahhüt/Filtrenize yürütme dönmeden önce yanıtı temizler. Bu nedenle, işlem başarısız olursa, dönüş kodunu bir hata olarak değiştiremezsiniz. Ayrıca, istisnalar bir JAX-RS ExceptionMapper tarafından yakalanmayacaktır.
ContainerRequestFilter/ContainerResponseFilter öğesinin kullanılması.
(ContainerRequest istek) { ... }
kamu ContainerResponse filtresi (ContainerRequest istek, ContainerResponse response) { ... }
Bu kadar kabarcık istisnalar tanımaktadır
kamu ContainerRequest filtresi bir ExceptionMapper için, ancak 2 ayrı yöntem/arabirim üzerinden mantığı böler. Sorun, bir yanıtı eşlemeyen bir istisna varsa, ContainerResponseFilter hiçbir zaman çağrılmamaktadır, bu yüzden temizleyemezsiniz.
JAX-RS ortamında bunu işlemenin tercih edilen yolu nedir? Yanıtın yıkanmasını yapılandırmanın bir yolu var mı, yoksa baktığım bir sınıf veya arayüz var mı?
Anlattığınız şey genellikle "açık oturum görünümü" (anti-) desen olarak bilinir. Bir tartışma için bkz. [Bu SO sorusu] (http://stackoverflow.com/q/1103363/131929). Ayrıca, daha fazla tartışma için JBoss'a (Hazırda Bekletme/Dikiş) dönün. https://community.jboss.org/docs/DOC-13954 –
Tam olarak bir "görünüm" in ne olduğuna dair bir tartışma var, ama bu sadece bir REST uygulaması. Jax-rs kaynak yöntemleri hizmet katmanıdır ve kalıcılık kullanırlar. Yanıt nesnesi, servis çağrısının sonucudur. Her yöntemde işlem yönetiminden kaçınmaya çalışıyorum ve cevap ya bir filtreye benzeyen bir şeydir, ya da CDI kesişimine (ki bu durumda projede bu noktadan kaçınmak isterim) kablo bağlarım var. – Shaun