我们有一个使用JSF2和Spring的应用程序。部署时应用程序正常运行。但如果我完成以下步骤,就会发生这种情况:
尝试使用之前打开的登录页面登录,并显示以下异常:
javax.servlet.ServletException: null source
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:321)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
root cause
java.lang.IllegalArgumentException: null source
at java.util.EventObject.<init>(EventObject.java:38)
at javax.faces.event.SystemEvent.<init>(SystemEvent.java:67)
at javax.faces.event.ComponentSystemEvent.<init>(ComponentSystemEvent.java:69)
at javax.faces.event.PostRestoreStateEvent.<init>(PostRestoreStateEvent.java:69)
at com.sun.faces.lifecycle.RestoreViewPhase.deliverPostRestoreStateEvent(RestoreViewPhase.java:256)
at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:245)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:107)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308)
如果我点击第一个登录页面然后输入登录详细信息,则应用程序不会中断。只有当我尝试将以前加载的登录页面与新部署的应用程序一起使用时,才会出现这种情
有人知道答案吗?
答案 0 :(得分:13)
这个应该被归为ViewExpiredException
。这是一个开始在Mojarra 2.0.3中出现的错误,并已在Mojarra 2.1.0中修复。另请参阅issue 1762(请注意,Mojarra 2.1.0 doesn't适用于Tomcat / Jetty,至少使用Mojarra 2.1.1)。
基本上,当Mojarra无法构建或恢复视图时,它通常会抛出一个特定的足够异常,但由于这个错误,后来在代码中错误地预期了有效视图,这反过来会导致{{1} }。可能的真正原因可能是视图包含一个简单的XML语法错误,例如缺少标记或损坏的属性值,Mojarra通常会抛出一个IllegalArgumentException: null source
详细消息,包括行号和位置等。
要阻止FaceletException
,您必须在对其执行任何操作之前通过GET请求刷新页面。如果您使用的Mojarra版本中没有显示此错误(例如2.0.2或更早版本,或2.1.0或更高版本),那么您可以使用ViewExpiredException
中的<error-page>
优雅地处理它特定的异常并提供一个自定义错误页面,其中通知最终用户会话已过期,以及指向初始请求URI的链接。
答案 1 :(得分:3)
这看起来像http://java.net/jira/browse/JAVASERVERFACES-1758
在Mojarra 2.1.x
中 未修复答案 2 :(得分:3)
只要 javax.faces.PARTIAL_STATE_SAVING 设置为 false ,您就会收到 java.lang.IllegalArgumentException 。如果您将 javax.faces.PARTIAL_STATE_SAVING 设置为 true (并且您知道自己在做什么),您将获得“好旧” javax.faces.application。 ViewExpiredException 返回。
答案 3 :(得分:-1)
在我的情况下,我发现我在xhtml文件中缺少一个jstl调用的结束标记。我正在使用选择标签和其中一个时间标签选择没有结束标签