jsf-2 - 配置 JBoss AS 7.1.1 与 Mojarra 2.0.4 问题

标签 jsf-2 jboss7.x mojarra

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

jboss-deployment-struct.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. session 超时(错误传播的异常)
  3. Tomcat 中 POST 参数数量限制

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

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

更新:刚刚在 PartialViewContextImpl.java:431 找到了该行显示ctx.getRenderKit()正在评估为 null 。不知道为什么但是

UPDATE2:事实证明,只有当我在表单中使用纯 html 输入组件时才会出现问题,即 <input type="text">, <select>等等。如果我从<h:form>中删除那些或者我将它们转换为相应的 JSF 标签,它工作得很好。某处出了严重的问题。我无法确切地弄清楚这是否是由 jboss、Mojarra 或特别是我的应用程序引起的。我用普通的 JSF 应用程序尝试过,无论我是否使用 html 输入标签,它都没有错误。所以这是我的应用程序和 jboss 7.x 的组合造成的。有什么想法吗?

最佳答案

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

解决方案是为 <h:form> 中包含的每个纯 html 组件赋予一个 name 属性。 。我无法理解的部分是这个错误似乎与 Mojarra 2.1.7 有关。我为我的应用程序配置的 jar 是 2.0.4 版本,但出现了错误。

关于jsf-2 - 配置 JBoss AS 7.1.1 与 Mojarra 2.0.4 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10698401/

相关文章:

java - 在 JSF 2 中从同一命令调用不同的操作

JSF 不会使用提交的输入值填充 @Named @RequestScoped bean

java - Wildfly 8.0 服务器中的 JMS 消息持久化

redirect - JSF/Mojarra ExternalContext.redirect() 创建一个 HttpSession

jsf - 如何下载 Mojarra JSF 每晚构建

java - Maven + JSF 2 + 谷歌应用引擎 : 404 error

java - 通过 JSF 中的 java 脚本启用/禁用按钮

java - Spring hibernate "You cannot commit during a managed transaction!"

java - Jboss 连接池配置

ajax - f :ajax not working on tomcat7/eclipse