Hãy tưởng tượng bạn có một bộ lọc bắt đầu một giao dịch cơ sở dữ liệu, xử lý yêu cầu, và sau đó cố gắng thực hiện giao dịch.Bạn có thể thực hiện lọc Servlet truyền thống bằng JAX-RS/Jersey không?
doFilter(...) {
...
transaction.begin();
filterChain.doFilter(request, response);
transaction.commit();
}
Sử dụng Jersey, có một số vấn đề:
- Sử dụng một bộ lọc, các Jersey Servlet container cam/xả phản ứng trước lợi nhuận thực hiện để bộ lọc của bạn. Vì vậy, nếu cam kết không thành công, bạn không thể sửa đổi mã trả về thành lỗi. Ngoài ra, các ngoại lệ sẽ không bị JAX-RS ExceptionMapper phát hiện.
Sử dụng vùng chứaRequestFilter/ContainerResponseFilter.
lọc ContainerRequest công cộng (ContainerRequest yêu cầu) { ... }
công cộng lọc ContainerResponse (ContainerRequest yêu cầu, ContainerResponse response) { ... }
này cho phép ngoại lệ đối với bong bóng lên cho một ExceptionMapper, nhưng tách logic trên 2 phương thức/giao diện riêng biệt. Vấn đề là nếu có một ngoại lệ không ánh xạ tới một phản hồi, thì ContainerResponseFilter sẽ không bao giờ được gọi, vì vậy bạn không thể dọn sạch.
Cách ưu tiên để xử lý điều này trong môi trường JAX-RS là gì? Có cách nào để cấu hình các flushing của phản ứng, hoặc là có một lớp học hoặc giao diện mà tôi nhìn?
Những gì bạn mô tả thường được gọi là mẫu "phiên mở trong chế độ xem" (chống). Xem [câu hỏi SO này] (http://stackoverflow.com/q/1103363/131929) để thảo luận. Cũng chuyển sang JBoss (Hibernate/Seam) để thảo luận thêm, ví dụ: https://community.jboss.org/docs/DOC-13954 –
Chắc chắn có một số cuộc tranh luận về chính xác "khung nhìn" cấu thành, nhưng đây chỉ là một ứng dụng REST. Phương thức tài nguyên jax-rs là lớp dịch vụ và chúng sử dụng sự kiên trì trực tiếp. Đối tượng phản hồi là kết quả của cuộc gọi dịch vụ. Tôi đang cố gắng tránh việc quản lý giao dịch trong mọi phương thức, và câu trả lời là một cái gì đó giống như một bộ lọc, hoặc tôi bắt đầu can thiệp CDI (mà tôi muốn tránh tại thời điểm này trong dự án, nếu tôi có thể). – Shaun