You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

迁移至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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 02:25:58