【问题标题】:java.lang.NullPointerException at org.primefaces.context.RequestContext.getCurrentInstanceorg.primefaces.context.RequestContext.getCurrentInstance 处的 java.lang.NullPointerException
【发布时间】:2013-03-20 02:40:55
【问题描述】:

我在托管 bean 方法中使用了 RequestContext 的 primeFaces 对象,以便从服务器端执行一些 javascript。我曾经在 Listener 处理程序方法中执行此操作(一个带有 AjaxBehaviourEvent 参数处理来自f:ajax 标签的请求的方法)并且它有效,但这次我使用了一个没有任何参数的方法。

问题是我用 jquery .append() 附加了一些 html 并且必须使用 jquery ajax 从添加的元素向服务器发送请求(我不能附加任何 jsf 组件,因为它们不能工作,因为它们不是由 jsf 本身生成),所以我必须使用不带参数的 bean 方法,并从处理 ajax comming resquests 的 servlet 调用该方法。

为了更详细地解释这一点,假设我以这种方式使用 jquery 添加 html 代码:

$('#substartmenudiv').append('<div id="congesdiv" />');

然后添加点击新添加的div后必须执行的代码:

$('#congesdiv').click(function(){
 $.post('AjaxRelaisServlet',{action:"setstrtmenustatus",startmenuisopen:startmenuisopen});
});

我从 servlet 捕获 ajax 请求发送的参数并调用 bean 方法:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


boolean startmenuisopen= Boolean.valueOf(request.getParameter("startmenuisopen"));

        UserBean.testcmdlink(startmenuisopen);

调用的 testcmdlink bean 方法包含 RequestContext 对象,它看起来像这样:

public static void testcmdlink(boolean startmenuisopen){        

        RequestContext context = RequestContext.getCurrentInstance();
        if(!startmenuisopen){
        context.execute("$('#substartmenudiv').append('<div id="+"gestprofdiv"+" />');");
        context.execute("displaymenuitems();");
        context.execute("console.log('more elements are appended !!');");
        startmenuisopen=true;

        }else{
            context.execute("$('#substartmenudiv').empty();");
            context.execute("window['bottomvalue'] =30;");
            context.execute("console.log('start menu div is emptied !!');");
            startmenuisopen=false;
        }

    }

有没有办法让它在任何地方工作?

干杯!

【问题讨论】:

  • 请发布代码,说明您想在该 AJAX 请求中做什么,以及您想调用的方法。
  • 嗨 BalusC!我需要你回答我之前的问题,请查看stackoverflow.com/questions/15691240/servlet-3-0-doesnt-work
  • 我知道可以采用其他一些方法来获得相同的结果,但我需要从服务器端对视图进行更多控制,因为我需要将 html 组件 css 属性保存在数据库中。实际上我需要这种方式来工作,因为我将来会更需要它。
  • 这有点令人困惑。您是在 servlet 还是托管 bean 中访问 RequestContext
  • 因为你可以看到 testcmdlink 是从 servlet 以静态方式访问的,当我在这里复制方法时忘记在方法中写“静态”,对不起。

标签: jsf jsf-2 primefaces managed-bean


【解决方案1】:

你不能那样做。在底层,RequestContext 依赖于 FacesContext 对象。这个对象is not available outside of a JSF lifecycle processing

可能可以通过找到一种方法在正确的 JSF 请求期间将 Constants.REQUEST_CONTEXT_ATTR 对象填充到一般的 ServletContext 中,然后在 servlet 中检索该对象来作弊。我将基于 PF 源代码中 RequestContext.getCurrentInstance() 的实现来实现这一信念的飞跃

public static RequestContext getCurrentInstance(){
 return (RequestContext)FacesContext.getCurrentInstance().getAttributes().get(Constants.REQUEST_CONTEXT_ATTR);
} 

【讨论】:

  • 似乎仍有希望在处理生命周期之外使用 RequestContext,就像您在上一篇文章中提到的 BalusC 文章中一样,但我仍然需要知道如何从 FacesContext 获取 RequestContext,我想知道这是可能的,因为我实际需要的 RequestContext 是一个 org.primefaces.context.RequestContext ,它有一个方法 execute(..JS..)
  • RequestContext 的实例被保存为 FacesContext 中的一个属性。我在这里找到了我的问题的答案:stackoverflow.com/questions/15428342/…
  • @user1705922,是的,看起来像。所以结合 BalusC 的 hack 和建议,你会得到你想要的。恭喜。我正在更新
  • 对不起,我没有看到你编辑了你的答案并告诉我:D
  • 经过一些测试,我不得不说在处理生命周期之外使用 FacesContext 没有任何意义,因为 FacesContext 实例是请求范围的(意味着它的内容是易变的),正如这里提到的 stackoverflow.com/questions/4605118/… 。所以,即使我得到了 FacesContext 实例,我发现它的属性映射几乎是空的(我刚刚找到 {com.sun.faces.INVOCATION_PATH=/AjaxRelaisServlet}),甚至我试图在它的参数映射上放置一个个性化的 RequestContext 它没有工作。
【解决方案2】:

您可以在问题中找到答案。我假设您有一个侦听器处理程序方法,它侦听请求并使用参数处理它们。因此,您需要传递一些参数,或者您需要创建一个不接受任何参数的新方法来处理您的请求。 当没有参数时,它会抛出 NullPointerException。

希望对你有帮助!!!

【讨论】:

    猜你喜欢
    • 2015-05-19
    • 2014-11-19
    • 2016-05-05
    • 2015-06-23
    • 2013-09-17
    • 2012-10-13
    • 2015-12-29
    • 2014-12-10
    相关资源
    最近更新 更多