迁移至JBoss 7.4后Richfaces的render属性失效求助
迁移至JBoss 7.4后RichFaces render属性页面抛出NullPointerException
环境
- Java 8
- RichFaces 4.5.0.Final(已升级至4.5.17.Final)
- OmniFaces 2.7(已升级至3.0)
问题
应用迁移到JBoss 7.4后,所有使用RichFaces render 属性的页面均无法正常渲染,抛出NullPointerException。
异常堆栈
09:28:53,389 SEVERE [javax.enterprise.resource.webcontainer.jsf.application] (default task-6) Error Rendering View[/views/operations/ci/list.xhtml]: java.lang.NullPointerException at org.richfaces.resource.ResourceHandlerImpl.getRendererTypeForResourceName(ResourceHandlerImpl.java:299) at javax.faces.application.ResourceHandlerWrapper.getRendererTypeForResourceName(ResourceHandlerWrapper.java:217) at javax.faces.application.ResourceHandlerWrapper.getRendererTypeForResourceName(ResourceHandlerWrapper.java:217) at com.sun.faces.context.PartialViewContextImpl.renderComponentResources(PartialViewContextImpl.java:482) at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:314) at org.richfaces.context.ExtendedPartialViewContext.processPartial(ExtendedPartialViewContext.java:264) at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:228) at org.omnifaces.context.OmniPartialViewContext.processPartial(OmniPartialViewContext.java:122) at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:1102) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1647) at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:442) at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:170) at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:132) at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:132) at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:132) at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:132) at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:132) at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:132) at org.omnifaces.viewhandler.OmniViewHandler.renderView(OmniViewHandler.java:115) at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:132) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:102) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:76) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:199) at org.apache.myfaces.extensions.cdi.jsf2.impl.listener.phase.CodiLifecycleWrapper.render(CodiLifecycleWrapper.java:126) at javax.faces.webapp.FacesServlet.executeLifecyle(FacesServlet.java:708) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:451) at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74) at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
解决方法
1. 对齐JSF版本兼容性
JBoss 7.4内置Mojarra 2.3.x,但RichFaces 4.5.x仅兼容Mojarra 2.2。即使升级RichFaces到4.5.17,仍可能存在版本冲突。建议:
- 在
jboss-deployment-structure.xml中排除JBoss内置JSF模块,将兼容的Mojarra 2.2打包进应用:
<jboss-deployment-structure> <deployment> <exclude-subsystems> <subsystem name="jsf" /> </exclude-subsystems> <exclusions> <module name="javax.faces.api" /> <module name="com.sun.jsf-impl" /> </exclusions> </deployment> </jboss-deployment-structure>
2. 修复ResourceHandler空指针
异常出现在ResourceHandlerImpl.getRendererTypeForResourceName,通常是资源名称为空导致。可以自定义包装类做防护:
public class SafeResourceHandler extends ResourceHandlerWrapper { private final ResourceHandler delegate; public SafeResourceHandler(ResourceHandler delegate) { this.delegate = delegate; } @Override public String getRendererTypeForResourceName(String resourceName) { return resourceName == null ? null : delegate.getRendererTypeForResourceName(resourceName); } @Override public ResourceHandler getWrapped() { return delegate; } }
在faces-config.xml注册该处理器:
<application> <resource-handler>com.your.project.SafeResourceHandler</resource-handler> </application>
3. 调整OmniFaces版本
OmniFaces 3.0要求JSF 2.3,与RichFaces 4.5.x不兼容。建议降级OmniFaces到2.14(JSF 2.2兼容的最新稳定版),搭配RichFaces 4.5.17使用。
4. 检查页面render属性
确认页面中render属性引用的组件ID存在且拼写正确,避免EL表达式返回空值或指向不存在的组件。
内容的提问来源于stack exchange,提问作者Roubben
相关产品推荐
相关产品推荐

