Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 JSF 2.0 ViewExpiredException_Jsf 2_Richfaces_Viewexpiredexception - Fatal编程技术网

Jsf 2 JSF 2.0 ViewExpiredException

Jsf 2 JSF 2.0 ViewExpiredException,jsf-2,richfaces,viewexpiredexception,Jsf 2,Richfaces,Viewexpiredexception,我一直在使用JSF1.2和这个答案中描述的ViewHandler:它非常有用,因为当出现异常时,页面会自动重新生成,这对公共页面很好。问题是它与JSF2.0不兼容。有人知道如何让它在JSF2.0或其替代品中工作吗 编辑: 我已经找到了这个解决方案:,但仍然想知道是否有任何方法可以像在JSF1.2中那样通过ViewHandler来实现。以下是我的JSF 2.0当前代码: public class AutoRegeneratorViewHandler extends GlobalResourcesV

我一直在使用JSF1.2和这个答案中描述的ViewHandler:它非常有用,因为当出现异常时,页面会自动重新生成,这对公共页面很好。问题是它与JSF2.0不兼容。有人知道如何让它在JSF2.0或其替代品中工作吗

编辑:

我已经找到了这个解决方案:,但仍然想知道是否有任何方法可以像在JSF1.2中那样通过
ViewHandler
来实现。以下是我的JSF 2.0当前代码:

public class AutoRegeneratorViewHandler extends GlobalResourcesViewHandler
{
    public AutoRegeneratorViewHandler(ViewHandler viewHandler)
    {
        super(viewHandler);
    }

    @Override
    public UIViewRoot restoreView(FacesContext p_oContext, String p_sViewID)
    {
         UIViewRoot oViewRoot = super.restoreView(p_oContext,p_sViewID);

         try
         {
             if(oViewRoot == null)
             {          
                 initView(p_oContext);

                 oViewRoot = createView(p_oContext,p_sViewID);
                 p_oContext.setViewRoot(oViewRoot);

                 try
                 {
                     renderView(p_oContext,oViewRoot);
                 }
                 catch(IOException e)
                 {
                     e.printStackTrace();
                 }

                 System.out.println("Created : " + p_sViewID);
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        return oViewRoot;
    }
}
这段代码去掉了
ViewExpiredException
但是当页面加载时,我看起来没有被记录

测试用例:

  • 打开网站
  • 等待时间超过当前会话到期时间(从
    web.xml
  • 输入用户名/密码
  • 点击登录按钮
  • 页面重新加载,登录表单为空
  • 重新加载页面
  • 页面显示欢迎和登录表单未显示(预期行为)

我认为JSF2的方法是提供自己的异常处理程序

在异常处理程序中,可以循环所有未处理的异常,检查ViewExpiredException并将其删除

甚至可以填充请求参数并导航到特定的facelet,该facelet可以呈现正确的信息页面,该页面使用从异常处理程序填充的请求参数。如果需要,甚至可以导航到登录屏幕


这里有一个这样的例子来描述如何实现它。

为什么不能将应用程序迁移到JSF 2.0?我已经迁移到JSF2.0,但是我在1.2中的解决方案已经不起作用了!当然这是一个好方法,但在登录屏幕的上下文中,您只能在浏览器中打开超过超时时间的屏幕,当您填写用户名/密码框并点击登录按钮时,它会变成ViewExpiredException。。。