【问题标题】:java.lang.IllegalArgumentException: null sourcejava.lang.IllegalArgumentException:空源
【发布时间】:2011-01-25 10:37:06
【问题描述】:

我们有一个使用 JSF2 和 Spring 的应用程序。该应用程序在部署时工作正常。但是,如果我执行以下步骤,就会发生这种情况:

  1. 打开应用程序的登录页面。
  2. 在服务器上重新部署了应用程序。
  3. 尝试使用之前打开的登录页面登录,但显示以下异常:

    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)
    

如果我单击第一个登录页面,然后输入登录详细信息,应用程序不会中断。仅当我尝试将先前加载的登录页面与新部署的应用程序一起使用时,才会发生这种情况。

有人知道答案吗?

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

    这个应该是ViewExpiredException。这是一个在 Mojarra 2.0.3 中开始出现并在 Mojarra 2.1.0 中修复的错误。另请参阅issue 1762(请注意 Mojarra 2.1.0 doesn't 在 Tomcat/Jetty 上工作,然后至少使用 Mojarra 2.1.1)。

    基本上,当 Mojarra 无法构建或恢复视图时,它通常会引发足够具体的异常,但由于这个错误,稍后在代码中错误地预期了有效视图,这反过来又导致 IllegalArgumentException: null source。可能的真正原因是视图包含一个简单的 XML 语法错误,例如缺少标记或损坏的属性值,Mojarra 通常会为此抛出一个带有非常详细消息的FaceletException行号和位置等。

    为防止出现ViewExpiredException,您必须先通过 GET 请求刷新页面,然后再对其执行任何操作。如果您使用的 Mojarra 版本没有出现此错误(例如 2.0.2 或更早版本,或 2.1.0 或更高版本),那么您可以在特定异常上使用 web.xml 中的 &lt;error-page&gt; 优雅地处理它提供一个自定义错误页面,通知最终用户会话已过期,以及指向初始请求 URI 的链接。

    【讨论】:

    • 我现在遇到了完全相同的问题,我会更新我的 mojarra 版本,看看是否会遇到类似的问题。
    • 我的 web.xml 中提到了错误页面,但我想知道是什么导致了这个问题,以及什么是正确的解决方法。
    • @Rachel:如果你问的是IllegalArgumentException: null source,如第 1 段所述,这是 Mojarra 中的一个错误。至少升级到 2.1.0。第 2 段解释了这个 bug 是什么以及在使用 Mojarra 处理这个 bug 时 IllegalArgumentException: null source 的另一个可能原因。第 3 段解释了如何处理 real 异常,在 OP 的特殊情况下是 ViewExpiredException。如果您想了解更多关于ViewExpiredException 的信息,请查看stackoverflow.com/tags/viewexpiredexception/info
    • 我当然没有ViewExpiredException,因为我的会话存储在cookies 中,而且我的页面没有保持打开很长时间。也只是一个想法,基于jsf 的第三方,如icefacesrichfacesprimefaces 应该减少开发工作和配置工作,我在做正确方面遇到了一些挑战。
    • @Rachel:那么这只是另一个可能的原因:XHTML 中的语法错误。升级到至少 2.1.0,然后你会看到真正的异常。
    【解决方案2】:

    这看起来像http://java.net/jira/browse/JAVASERVERFACES-1758

    在 Mojarra 2.1.x 中没有修复

    【讨论】:

      【解决方案3】:

      只要将 javax.faces.PARTIAL_STATE_SAVING 设置为 false,您就会收到 java.lang.IllegalArgumentException。如果您将 javax.faces.PARTIAL_STATE_SAVING 设置为 true(并且您知道自己在做什么),您将获得“旧的”javax.faces.application。 ViewExpiredException 返回。

      【讨论】:

        【解决方案4】:

        在我的情况下,我在 xhtml 文件中缺少用于 jstl 调用之一的结束标记。我正在使用选择标签,而选择之间的标签之一没有结束标签

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-31
          • 2013-04-29
          • 2019-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多