gpt4 book ai didi

jsf - 将 OmniFaces ViewScoped bean 注入(inject) servlet 时出现 ContextNotActiveException

转载 作者:行者123 更新时间:2023-12-04 04:39:33 28 4
gpt4 key购买 nike

我刚刚将 SessionScoped bean 更新为 OmniFaces (1.6.1) ViewScoped。一切似乎都有效,除了当我的支持 bean 被注入(inject)我用于处理 ajax 请求的 Servlet 时,我得到以下异常:

org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type org.omnifaces.cdi.ViewScoped

需要考虑的一些事项:

1) 我必须将支持 bean 注入(inject) servlet 的原因是因为我使用的是 jQuery 的 DataTables 插件,该插件(用于服务器端处理表)需要一个 ajax 请求来检索表数据。所以基本上我不能使用 Primefaces 的 <p:remoteCommand..>或类似的东西。

2)据我所知,没有任何额外的 GET 请求会破坏和重新创建支持 bean。

还有其他可能导致此异常的原因吗?另外,如果无法做到这一点,是否还有另一种方法可以实现我正在做的事情?

最佳答案

@ViewScoped注释将 bean 与特定的 JSF View 联系起来,而后者又依赖于 FacesContext#getViewRoot() 的存在。随后 UIViewRoot#getViewMap() .两者都不能在“plain vanilla”servlet 中使用。在普通的 servlet 请求中没有 JSF View ,更不用说 JSF 上下文了。因此,不幸的是,这种行为是“设计使然”。

你基本上有两个选择:

  • 将所需的共享信息存储在 session 范围中,该信息由一个唯一键作为键,该键作为 HTTP 请求参数传递,以便 JSF 托管 bean 和 servlet 都可以从 session 范围中获取它。

    例如。在 JSF 支持 bean 中:

    dataId = UUID.randomUUID().toString();
    externalContext.getSessionMap().put(dataId, data);

    在 JSF View 中:

    <h:outputScript>var dataId = "#{bean.dataId}";</h:outputScript>

    在 JavaScript 中:

    function loadData() {
    $.get("servletURL", { dataId: dataId }, function(response) {
    // ...
    });
    }

    在小服务程序中:

    String dataId = request.getParameter("dataId");
    Data data = (Data) session.getAttribute(dataId);

  • 使用真正的 JSF 支持 bean 而不是普通的 servlet。你绝对可以使用<p:remoteCommand>为了那个原因。您可以使用 RequestContext#addCallbackParam()在 action(listener) 方法中“传递”(“打印”在技术上更正确)一个 JSON 对象从 Java 到 JS,最后使用 oncomplete属性来处理它。鉴于您使用的是 OmniFaces, <o:commandScript> Ajax#data() 提供相同的功能。 Ajax#data()具有额外的优势,它会自动从 Java 转换为 JSON,因此您不需要自己做。

    例如。在 JSF View 中:

    <o:commandScript name="loadData" action="#{bean.loadData}" oncomplete="processData()" />

    在 JSF 支持 bean 中:
    public void loadData() {
    Ajax.data(data);
    }

    在 JavaScript 中:

    function processData() {
    var data = OmniFaces.Ajax.data;
    // ...
    }
  • 关于jsf - 将 OmniFaces ViewScoped bean 注入(inject) servlet 时出现 ContextNotActiveException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19138666/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com