【发布时间】:2017-09-24 10:52:43
【问题描述】:
我有以下要注入 CDI bean 的 servlet
public class FBOAuthFilter implements Filter {
@Inject
private Instance<LoginBean> loginBeanSource;
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain fc) throws IOException, ServletException {
try{
String code = request.getParameter("code");
LoginBean loginBean = loginBeanSource.get();
loginBean.doLogin(code);
} catch(Exception ex){
System.out.println("Exception");
}
}
}
CDI 豆:
@Named(value="loginbean")
@SessionScoped
public class LoginBean implements Serializable{
public void doLogin(String code){
//do something
FacesContext context = FacesContext.getCurrentInstance();
System.out.println(context == null);
context.getExternalContext().redirect("somepage");
}
}
但是,当我尝试访问 CDI Bean 中的 FacesContext 时,它为空。有没有办法访问 FacesContext ?
【问题讨论】:
-
FacesContext 是在 FacesServlet 中创建的。因为过滤器在 servlet 之前执行,所以 FacesContext 还不可用。为什么需要 FacesContext?没有它你能应付吗?
-
@tuner 我的大部分业务逻辑都是在 servlet 过滤器中完成的,我可以做一个解决方法并将所有内容移至 Faces Servlet,但我想知道在 servlet-filter 中访问 FacesContext 并获得CDI bean 的实际实例,而不是代理。
标签: jsf servlets cdi servlet-filters