我目前正在将 JSF-1.2 应用程序迁移到 Wildfly 8 Final,但遇到了困难:(
首先,我读过很多有关相关问题的帖子(例如https://community.jboss.org/message/845006 or 将 JSF 1.2 Seam 应用程序迁移到 WildFly Beta 1)但建议的解决方案(不包括焊接子系统)对我不起作用。
我做了什么:
- 我遵循了多jsf功能教程here并安装了 JSF 1.2 作为 Wildfly 的模块(准确地说,是 3 个模块)。
- 接下来,我将 javax.faces.api 和 com.sun.jsf-impl(主槽)的排除项以及 1.2 槽的相应依赖项添加到我的 jboss-deployment-struction.xml 中。
- 由于该应用程序使用 Tomahawk 和 Tomahawk Sandbox,我也用我的耳朵进行部署,因此我还排除了主插槽,并为这些部署包含了两个模块的 1.2 插槽。
我的问题:
- 当我尝试调用部署的初始页面(login.xhtml)时,出现以下错误,该错误是由插槽 1.2 中的模块“org.jboss.as.jsf-injection”引起的
ERROR [request] UT005023: Exception handling request to /backoffice/login.faces: java.lang.NoSuchMethodError: javax.faces.context.FacesContext.getAttributes()Ljava/util/Map;
[exec] at org.jboss.weld.jsf.ConversationAwareViewHandler.getActionURL(ConversationAwareViewHandler.java:103)
[exec] at javax.faces.application.ViewHandlerWrapper.getActionURL(ViewHandlerWrapper.java:147)
[exec] at com.sun.facelets.FaceletViewHandler.getActionURL(FaceletViewHandler.java:807)
[exec] at org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlRenderer.getActionUrl(HtmlRenderer.java:77)
[exec] at org.apache.myfaces.custom.form.HtmlFormRenderer.getActionUrl(HtmlFormRenderer.java:45)
[exec] at org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlFormRendererBase.encodeBegin(HtmlFormRendererBase.java:102)
[exec] at org.apache.myfaces.custom.form.HtmlFormRenderer.encodeBegin(HtmlFormRenderer.java:134)
[exec] at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:816)
[exec] at javax.faces.component.UIComponent.encodeAll(UIComponent.java:928)
[exec] at javax.faces.component.UIComponent.encodeAll(UIComponent.java:933)
[exec] at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:594)
[exec] at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:110)
[exec] at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
[exec] at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
[exec] at javax.faces.webapp.FacesServlet.service(FacesServlet.java:266)
[exec] at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
[exec] at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:130)
[exec] at com.jamonapi.JAMonFilter.doFilter(JAMonFilter.java:57)
[exec] at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:56)
[exec] at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
[exec] at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:190)
[exec] at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:56)
[exec] at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
[exec] at org.apache.myfaces.custom.conversation.ConversationServletFilter.doFilter(ConversationServletFilter.java:78)
[exec] at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:56)
[exec] at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
[exec] at org.apache.myfaces.custom.requestParameterProvider.RequestParameterServletFilter.doFilter(RequestParameterServletFilter.java:66)
[exec] at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:56)
[exec] at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
[exec] at de.voebzvd.indra.backoffice.webapp.AvoidCachingFilter.doFilter(AvoidCachingFilter.java:53)
[exec] at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:56)
[exec] at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
[exec] at org.securityfilter.filter.SecurityFilter.doFilter(SecurityFilter.java:188)
[exec] at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:56)
[exec] at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
[exec] at de.voebzvd.logging.BaseFilter.doFilter(BaseFilter.java:44)
[exec] at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:56)
[exec] at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
[exec] at de.voebzvd.logging.NDCFilter.doFilter(NDCFilter.java:50)
[exec] at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:56)
[exec] at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
[exec] at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85)
[exec] at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61)
[exec] at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
[exec] at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
[exec] at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25)
[exec] at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:113)
[exec] at io.undertow.security.handlers.AuthenticationCallHandler.handleRequest(AuthenticationCallHandler.java:52)
[exec] at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45)
[exec] at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:61)
[exec] at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70)
[exec] at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76)
[exec] at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25)
[exec] at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
[exec] at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25)
[exec] at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25)
[exec] at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:240)
[exec] at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:227)
[exec] at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:73)
[exec] at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:146)
[exec] at io.undertow.server.Connectors.executeRootHandler(Connectors.java:168)
[exec] at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:687)
[exec] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
[exec] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
[exec] at java.lang.Thread.run(Thread.java:744)
该错误是由 ConversationAwareViewHandler 引起的,它包含在模块 org.jboss.as.jsf-injection 中的 jarweld-core-jsf-2.1.2.Final.jar 中,我也随 JSF 1.2 模块一起安装了该模块。该类仍然引用 JSF 2.2 API,因此会失败。
从战斧和我的战争中排除焊接子系统也不起作用。我试过这个:
<sub-deployment name="myfaces-tomahawk-core.jar">
<exclude-subsystems>
<subsystem name="weld" />
</exclude-subsystems>
<exclusions>
<module name="javax.faces.api" slot="main" />
<module name="com.sun.jsf-impl" slot="main" />
</exclusions>
<dependencies>
<module name="com.sun.jsf-impl" slot="1.2" />
<module name="javax.faces.api" slot="1.2" />
<module name="org.apache.commons.beanutils" />
<module name="org.apache.commons.lang" />
<module name="org.apache.commons.logging" />
</dependencies>
</sub-deployment>
<sub-deployment name="myfaces-tomahawk-sandbox.jar">
<exclude-subsystems>
<subsystem name="weld" />
</exclude-subsystems>
<exclusions>
<module name="javax.faces.api" slot="main" />
<module name="com.sun.jsf-impl" slot="main" />
</exclusions>
<dependencies>
<module name="com.sun.jsf-impl" slot="1.2" />
<module name="javax.faces.api" slot="1.2" />
<module name="org.apache.commons.beanutils" />
<module name="org.apache.commons.collections" />
<module name="org.apache.commons.lang" />
<module name="org.apache.commons.logging" />
</dependencies>
</sub-deployment>
<sub-deployment name="backoffice.war">
<exclude-subsystems>
<subsystem name="weld" />
</exclude-subsystems>
<exclusions>
<module name="javax.faces.api" slot="main" />
<module name="com.sun.jsf-impl" slot="main" />
</exclusions>
<dependencies>
<module name="com.sun.jsf-impl" slot="1.2" />
<module name="javax.faces.api" slot="1.2" />
<module name="net.sourceforge.jamonapi" />
<module name="org.apache.commons.beanutils" />
<module name="org.apache.commons.codec" />
<module name="org.apache.commons.lang" />
<module name="org.apache.commons.logging" />
</dependencies>
</sub-deployment>
我还能做什么?
简而言之,这个问题是由weld 和 JSF 1.2 不兼容引起的,在未来的版本中不会修复(请参阅here).
在我看来,可以采取三种方式:
- 升级您的应用程序代码以使用 JSF 2.x。
- 必要时排除焊接子系统(可能需要重新配置 wildfly 的默认 cdi 设置)。
- 修补类
ConversationAwareViewHandler
在旧的 JSF API 中适当地采取不同的行为。
对于我来说,只有修补 JSF 注入模块的选项,因为应用程序升级是不可能的,并且选项 2 需要对应用程序进行更大的重组。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)