【问题标题】:Access a managed property in filter访问过滤器中的托管属性
【发布时间】:2012-11-16 03:26:33
【问题描述】:

在我试图找出这个问题中所述问题的原因时:JSF2 slow page loading,我想为我使用的用户会话过滤器计时。我创建了一个计时器,它是一个 ApplicationScoped bean。

我的问题是是否可以从过滤器中将此 bean 作为托管属性访问。在我的其他 bean 中,我可以这样做,尽管在过滤器中托管属性始终为空。

【问题讨论】:

  • 当你说“过滤器”时,你真的是指javax.servlet.Filter吗? (如果是这样,您应该使用[servlet-filters] 标签,而不是[filter]!)在这种情况下,当前接受的答案毫无意义。
  • 你是对的。我已将标签更改为正确的标签。关于答案,最后一个建议奏效了。不过,我仍然不确定 ManagedProperty 的机制在这种情况下是如何工作的。
  • FacesContext 通常在 servlet 过滤器中根本不可用,所以它为什么对你有用是我无法理解的。托管属性仅在托管 bean 中起作用,但是 servlet 过滤器不是托管 bean。然后,您的问题基本上得到了与此问题相同的答案:stackoverflow.com/questions/2633112/…
  • 感谢您启发我以及链接中的示例。

标签: jsf-2 properties servlet-filters


【解决方案1】:

更新答案:

通过以下方式从过滤器访问您的应用范围 bean

ServletContext context = req.getServletContext();
MyAppBean myAppBean = (MyAppBean) context.getAttribute("myAppBean");

通过以下方式从过滤器访问您的会话范围 bean

HttpSession session = ((HttpServletRequest) req).getSession(false);
MyAppBean myAppBean = (MyAppBean ) session.getAttribute("myAppBean");

原答案:

是的,您可以,将其设为(eager = true),并添加所需的注释

@ManagedBean(eager = true)
@ApplicationScoped
public class MyAppBean { }

并在您的会话范围 bean 中像这样访问它

@ManagedProperty(value = "#{myAppBean }")
private MyAppBean myAppBean; //add getter and setter

如果您的 bean 不是 @ManagedBean,您可以像这样从 ApplicationMap 访问它

MyAppBean myAppBean = (MyAppBean ) FacesContext.getCurrentInstance().
    getExternalContext().getApplicationMap().get("country");

如果您要访问的 bean 是 @SessionScoped,您可以像这样从 SessionMap 获取它

MyAppBean myAppBean = (MyAppBean ) FacesContext.getCurrentInstance().
    getExternalContext().getSessionMap().get("country");

这里有一些关于如何从非托管 bean 访问 bean 的不错的教程

Access A Managed Bean From Event Listener – JSF

【讨论】:

  • 恐怕没什么区别。过滤器是否需要成为一个 bean 才能工作?目前不是。
  • 它使用您的最后一个解决方案工作。但是,将过滤器注册为 ManagedBean 并没有。诡异的。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 2011-06-21
  • 2012-05-22
相关资源
最近更新 更多