我在 JBoss AS 5.1.0 GA 上有一个工作 webapp。它使用 Mojarra 2.0.4 罐子。我正在将其迁移到 JBoss AS 7.1.1。此版本的 JBoss 随 2.1.7 一起提供。META-INF/jboss-deployment-structure.xml
因此,我通过为 2.0.4 定义插槽并将它们与其他依赖项一起称为依赖项来降级 Mojarra 版本。
jboss-部署-结构.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
我参考了这个链接并修改了我的依赖项,如下所示
<?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]
我认为(当然是通过谷歌搜索)异常通常是由三件事引起的
- xhtml 中使用了无效/未关闭的标签(错误传播的异常)
- 会话超时(错误传播的异常)
- Tomcat中POST参数的限制
不幸的是,前两个不是原因。我通过验证器运行了错误的 xhtml 页面,发现标记是有效的,我的会话也没有过期。我还增加了org.apache.tomcat.util.http.Parameters.MAX_COUNT
5000standalone.xml
以解决第三点。错误仍然存在。
我还尝试迁移到默认捆绑的 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>
我从 ie 等中删除它们,<h:form>
或者将它们转换为相应的 JSF 标记,它工作正常。某处出现了严重的问题。我无法确定这是由 jboss、Mojarra 还是特别是我的应用程序引起的。我用一个普通的 JSF 应用程序尝试了它,无论我是否使用 html 输入标签,它都没有错误。所以它是我的应用程序和 jboss 7.x 的组合导致了这种情况。有任何想法吗?