【问题标题】:FacesContext in a @WebListener@WebListener 中的 FacesContext
【发布时间】:2016-02-21 09:11:57
【问题描述】:

我需要在 @WebListener 中构建一些 jsf url。

我想我可以使用这样的 sn-p 代码

    final FacesContext currentInstance = FacesContext.getCurrentInstance();
    final String actionURL = currentInstance.getApplication().getViewHandler()
            .getActionURL(currentInstance, viewId);

因为.getCurrentInstance() 的 javadoc 断言它可以“[...] 在应用程序初始化或关闭期间调用”但它不起作用,因为它返回 null。

我错过了什么吗?给定 viewId 的任何其他方式来构建 url?

谢谢

【问题讨论】:

  • 您认为这可能是解决方案的真正问题是什么?
  • 这就是我需要的。在上下文开始时,我需要以与配置无关的方式为另一个 web 应用程序(完全不知道 jsf,但这不应该是相关的)生成一些 url。我知道我可以做类似servletContext.getContextPath() + "/file.xthml" 的事情,但我希望有更好的方法。
  • 为什么是“更好”的方式?你这样做的方式有什么问题?也许再解释一下
  • 我不想处理 facelets 扩展和映射,而是让 jsf 来完成这项工作。很简单
  • 描述您希望/需要如何以及在何处将此 viewId 呈现给其他 web 应用程序......这就是您真正的“问题”,您似乎“卡在”这个解决方案中。 ... FacesContext 当前实例在达到 FacesServlet 之后可用,而不是之前可用(可以在其他帖子中阅读)。所以这就是为什么它是空的。但是对你来说很直接的东西对我来说完全模糊,但这可能是由于我有限的视野/视野/知识/......也许其他人可以帮助......

标签: jsf-2.2 servletcontextlistener facescontext


【解决方案1】:

FacesContext.getCurrentInstance() 方法确实在 linstener(在我的例子中为 com.sun.faces.config.ConfigureListener)初始化和 FacesServlet 的第一次运行之间返回一个有效的 facesContext 实例,其中 facesContext 设置由侦听器向上释放。 我的问题是我让 Wildfly 添加监听器,它是在我之后添加的。强制将其加载到web-fragment.xml/web.xml

<listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>
<listener>
    <listener-class>com.company.project.somepackages.Listener</listener-class>
</listener>

让我的听众初始化上下文。

上面的代码然而不起作用,因为 viewHandler 在尝试解析 contextPath 时使用 externalContext.getRequestContextPath() 方法,显然返回 null,而不是可能返回的 externalContext.getApplicationContextPath()正确的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 2011-10-13
    相关资源
    最近更新 更多