2012-12-26 67 views
12

Làm cách nào để truy xuất FacesContext trong Bộ lọc?Làm cách nào để truy xuất FacesContext trong Bộ lọc

Tôi đi theo bài viết sau đây về cách lấy FacesContext trong một Filter:

http://ocpsoft.org/java/jsf-java/jsf-20-extension-development-accessing-facescontext-in-a-filter/

Nhưng vấn đề là nó không được làm việc với phạm vi Flash. NPE sau được ném:

java.lang.NullPointerException 
at com.sun.faces.context.flash.ELFlash.loggingGetPhaseMapForWriting(ELFlash.java:751) 
at com.sun.faces.context.flash.ELFlash.getPhaseMapForWriting(ELFlash.java:785) 
at com.sun.faces.context.flash.ELFlash.put(ELFlash.java:392) 
at com.sun.faces.context.flash.ELFlash.put(ELFlash.java:112) 

Tôi muốn thêm chuyển hướng trong bộ lọc của tôi và sử dụng phạm vi flash để tiết kiệm một số dữ liệu và cũng tin nhắn, mà không hoạt động.

Trả lời

21

Làm cách nào để truy xuất FacesContext trong Bộ lọc?

Bạn không thể. FacesContext được tạo bởi FacesServlet và do đó chỉ có sẵn trong bất kỳ mã Java nào được xử lý bởi FacesServlet, bao gồm tất cả các tạo phẩm JSF, chẳng hạn như các bean được quản lý và trình lắng nghe pha. Bài viết chỉ cho thấy cách tạo thủ công các FacesContext, nhưng cách tiếp cận này cuối cùng là vô ích. Các FacesContext chỉ là một trừu tượng của tất cả mọi thứ đã có sẵn bởi API Servlet tiêu chuẩn như HttpServletRequest, HttpSession, ServletContext, vv Chỉ cần sử dụng chúng trực tiếp giống như cách JSF đang làm "dưới mui xe".

Bạn có 2 lựa chọn:

  1. Sử dụng JSF PhaseListener để thay thế. Tùy thuộc vào yêu cầu chức năng cụ thể mà bạn đã không nói bất cứ điều gì về, điều này có thể là một giải pháp thay vì vụng về/workaround.

  2. Không sử dụng cơ sở phạm vi Flash do JSF cung cấp, nhưng bạn hãy tự mình dùng homebrew. Nguyên tắc khá đơn giản: đặt cookie theo yêu cầu ban đầu, gửi chuyển hướng, trong yêu cầu chuyển hướng tra cứu cookie xóa nó (để không còn trên bất kỳ yêu cầu nào tiếp theo). Đó chính là cách mà phạm vi của JSF Flash hoạt động dưới nắp đậy. Xem thêm Set notification message as request attribute which should show after sendRedirect để biết ví dụ cụ thể.

+0

"do đó chỉ có sẵn trong bất kỳ mã Java nào được xử lý bởi FacesServlet, bao gồm tất cả các tạo phẩm JSF, chẳng hạn như bean được quản lý" Bây giờ tôi đang bối rối. Khi tôi tra cứu một bean được quản lý bằng cách sử dụng 'HttpSession.getAttribute()', FacesContext hiện tại vẫn là null. – djmj

+1

Bộ lọc chạy trước 'FacesServlet'. Vì vậy, nhận được phiên quản lý scoped bean từ đó, nơi JSF đã lưu trữ "dưới nắp" trước khi 'FacesServlet' đã chạy không cho phép bạn truy cập vào' FacesContext'. – BalusC

+0

Điều đó giải thích hành vi. Cảm ơn bạn đã trả lời :) – djmj

Các vấn đề liên quan