【问题标题】:Configuring JBoss AS 7.1.1 with Mojarra 2.0.4 issues使用 Mojarra 2.0.4 问题配置 JBoss AS 7.1.1
【发布时间】:2012-05-28 17:30:53
【问题描述】:

我有一个在 JBoss AS 5.1.0 GA 上工作的 webapp。它使用 Mojarra 2.0.4 罐子。我正在将其迁移到 JBoss AS 7.1.1。此版本的 JBoss 随 2.1.7 一起提供。因此,我通过为 2.0.4 定义插槽并将它们称为 META-INF/jboss-deployment-structure.xml 中的依赖项以及其他依赖项来降级 Mojarra 版本。

jboss-deployment-structure.xml

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
  <deployment>
    <exclusions>
          <module name="javax.faces.api" slot="main"/>
          <module name="com.sun.jsf-impl" slot="main"/>
          <module name="javax.faces.api" slot="1.2"/>
          <module name="com.sun.jsf-impl" slot="1.2"/>          
        </exclusions>
        <dependencies>
          <module name="org.hibernate.validator" export="true"/>
          <module name="javax.validation.api" export="true"/>
          <module name="com.google.gson" export="true"/>
          <module name="org.codehaus.jettison" export="true"/>
          <module name="org.jboss.resteasy.resteasy-jaxrs" export="true"/>
          <module name="org.jboss.resteasy.resteasy-jackson-provider" export="true"/>
          <module name="org.apache.log4j" export="true"/>
          <module name="org.jboss.as.web" slot="main" export="true"/>
          <module name="javax.faces.api" slot="2.0.4" export="true"/>
          <module name="com.sun.jsf-impl" slot="2.0.4" export="true"/>       
        </dependencies>
  </deployment>   
 </jboss-deployment-structure>

这导致在部署时抛出以下异常

12:51:18,761 INFO  [javax.enterprise.resource.webcontainer.jsf.config] (MSC service thread 1-3) Initializing Mojarra 2.0.4 (FCS b09) for context ''
12:51:20,355 INFO  [javax.enterprise.resource.webcontainer.jsf.config] (MSC service thread 1-3) Unsanitized stacktrace from failed start...: javax.faces.FacesException: Class org.jboss.as.web.deployment.jsf.JandexAnnotationProvider is not an instance of com.sun.faces.spi.AnnotationProvider

我引用了this链接并修改了我的依赖项如下

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
  <deployment>
        <exclusions>
          <module name="javax.faces.api" slot="main"/>
          <module name="com.sun.jsf-impl" slot="main"/>
          <module name="javax.faces.api" slot="1.2"/>
          <module name="com.sun.jsf-impl" slot="1.2"/>
          <module name="org.jboss.as.web" slot="main" />
        </exclusions>
        <dependencies>
          <module name="org.hibernate.validator" export="true"/>
          <module name="javax.validation.api" export="true"/>
          <module name="com.google.gson" export="true"/>
          <module name="org.codehaus.jettison" export="true"/>
          <module name="org.jboss.resteasy.resteasy-jaxrs" export="true"/>
          <module name="org.jboss.resteasy.resteasy-jackson-provider" export="true"/>
          <module name="org.apache.log4j" export="true"/>
          <module name="org.jboss.as.web" slot="main" export="true"/>
          <module name="javax.faces.api" slot="2.0.4" export="true"/>
          <module name="com.sun.jsf-impl" slot="2.0.4" export="true"/>
          <module name="org.jboss.as.web" slot="main">
          <imports>
            <include path="/org/**" />
            <exclude path="/META-INF/**" />
          </imports>
          </module>
        </dependencies>
  </deployment>   
 </jboss-deployment-structure>

消除了部署时的错误,但引入了以下运行时异常

12:59:19,434 ERROR [stderr] (http--0.0.0.0-8080-4) java.lang.IllegalArgumentException: null source
12:59:19,435 ERROR [stderr] (http--0.0.0.0-8080-4)  at java.util.EventObject.<init>(EventObject.java:38)
12:59:19,436 ERROR [stderr] (http--0.0.0.0-8080-4)  at javax.faces.event.SystemEvent.<init>(SystemEvent.java:71)
12:59:19,444 ERROR [stderr] (http--0.0.0.0-8080-4)  at javax.faces.event.ComponentSystemEvent.<init>(ComponentSystemEvent.java:73)

和

12:59:19,489 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/].[Faces Servlet]] (http--0.0.0.0-8080-4) Servlet.service() for servlet Faces Servlet threw exception: java.lang.NullPointerException
    at com.sun.faces.context.PartialViewContextImpl.createPartialResponseWriter(PartialViewContextImpl.java:431) [jsf-impl.jar:2.0.4-b09]
    at com.sun.faces.context.PartialViewContextImpl.access$300(PartialViewContextImpl.java:72) [jsf-impl.jar:2.0.4-b09]
    at com.sun.faces.context.PartialViewContextImpl$DelayedInitPartialResponseWriter.getWrapped(PartialViewContextImpl.java:559) [jsf-impl.jar:2.0.4-b09]

我认为(当然是通过谷歌搜索)异常通常是由三件事引起的

  1. xhtml 中使用了无效/未关闭的标签(错误传播的异常)
  2. 会话超时(错误传播的异常)
  3. Tomcat 中 POST 参数的限制

不幸的是,前两个不是原因。我通过验证器运行了错误的 xhtml 页面,发现标记是有效的,我的会话也没有过期。我还在standalone.xml 中将org.apache.tomcat.util.http.Parameters.MAX_COUNT 增加到5000 以解决第三点。错误仍然存​​在。

我还尝试迁移到默认捆绑的 Mojarra 2.7.1 版本。这阻止了第一个运行时异常,但第二个仍然存在。 导致此错误的那些页面的唯一特殊之处在于它们中有 ajax 调用。 有趣的是,该应用程序在 AS 5.1.0 GA 上运行良好,所以如果我的标记有误,我在 5.1.0 上也会遇到困难,但事实并非如此。所以无效标记是不可能的。 任何指针都非常感谢!

更新:刚刚发现PartialViewContextImpl.java:431 处的那一行显示ctx.getRenderKit() 正在评估为null。不知道为什么虽然

UPDATE2:事实证明,只有当我在表单中使用纯 html 输入组件时才会出现问题,例如 &lt;input type="text"&gt;, &lt;select&gt; 等。如果我从 &lt;h:form&gt; 中删除这些输入组件或转换它们进入相应的JSF标签,它工作正常。某处出现了严重的问题。我无法确定这是由 jboss、Mojarra 还是特别是我的应用程序引起的。我用一个普通的 JSF 应用程序尝试了它,无论我是否使用 html 输入标签,它都没有错误。所以它是我的应用程序和 jboss 7.x 的组合导致了这种情况。有什么想法吗?

【问题讨论】:

  • 两个异常的根本原因相同:根本没有UIViewRoot。假设它只发生在 POST 上,从会话中恢复视图显然失败了。我不确定,但从理论上讲,特定的 JBoss 7 实例有可能具有不同的会话管理机制来序列化会话。您所有的视图范围 bean 是否都实现了Serializable?尝试将状态保存方法设置为client 进行测试,它应该在日志中为未实现可序列化但应该实现的类产生警告。
  • @BalusC: 嗯.. 是的,我的视图范围 bean 确实实现了Serializable。我也曾尝试将状态保存方法设置为client。我现在又试了一次,还是没有解决!
  • @BalusC:我在web.xml 中设置了许多上下文参数,这可能是冲突的......?请看pastebin.com/5Z5e9usd
  • com.sun.faces.numberOfViewsInSession 的值非常低,为 1。默认值为 15。但这只会在最终用户在多个浏览器选项卡中打开同一页面时造成问题。值为 1 时,任何先前打开的选项卡中的同一页面都会立即过期。
  • @BalusC:我保留的太低了,因为整个应用程序只有两个页面可以导航到。所以我只需要将前一页的状态保存在内存中。还是太低了吗?它会破坏视图恢复吗?

标签: jsf-2 jboss7.x mojarra


【解决方案1】:

终于!该问题与 Mojarra 2.1.7 中的错误有关,据报告 here

解决方案是为&lt;h:form&gt; 中包含的每个纯html 组件赋予一个name 属性。我无法理解这个错误似乎与 Mojarra 2.1.7 有关的部分。而且我为我的应用配置的jar是2.0.4版本的,但是还是看到了错误。

【讨论】:

  • 有趣。尽管使用“仅使用名称属性”作为解决方案,但该问题已解决。我想知道它是否不应该被实际修复。
  • 恕我直言,它应该被修复。就我而言,我真的不需要名称属性!我添加它只是为了让它工作。
  • 此外,我使用 jQuery 插件(我的和第三方的)在客户端生成输入和选择元素。现在我必须确保即使 他们 也有 name 属性! -_-
猜你喜欢
  • 1970-01-01
  • 2012-08-28
  • 2012-12-02
  • 2013-04-20
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多