【问题标题】:java.lang.NullPointerException at javax.faces.component.UIComponentBase.isRendered only in MyFacesjava.lang.NullPointerException at javax.faces.component.UIComponentBase.isRendered 仅在 MyFaces
【发布时间】:2017-11-09 20:45:11
【问题描述】:

我在尝试使用具有 MyFaces 的 WAS 9 服务器时遇到了问题。我的应用程序在 tomcat 上使用 Mojarra。

可以在 tomcat 中测试的最小、完整和可验证的示例(请忽略与 primefaces 相关的任何内容):

莫哈拉:https://github.com/ravihariharan/primefaces-test 我的脸:https://github.com/ravihariharan/primefaces-test-myfaces

参考文件:TestNull.java、BaseBean.java、testnull.xhtml

Oracle Mojarra 2.2.15 与 Apache MyFaces 问题 2.2.12

public class TestNull extends BaseBean {

private Boolean testNullRender; 
//This has not be been instantiated on purpose

public TestNull() {
    super();
}

@PostConstruct
public void postConstruct() {
   //HtmlPanelGroup panel = new HtmlPanelGroup();
   HtmlPanelGroup panel = (HtmlPanelGroup) FacesContext.getCurrentInstance().getApplication()
            .createComponent(HtmlPanelGroup.COMPONENT_TYPE);

    String valueExpression = "#{testNull.testNullRender}";
    panel.setValueExpression(PropertyConstants.RENDERED, createValueExpression(valueExpression, Boolean.class));

    addComponent("form:panelId", panel);
}

public Boolean getTestNullRender() {
    return testNullRender;
}

public void setTestNullRender(Boolean testNullRender) {
    this.testNullRender = testNullRender;
}
}

仅在 MyFaces 中出错:

java.lang.NullPointerException


phaseId=RENDER_RESPONSE(6)

Caused by:
java.lang.NullPointerException
 at javax.faces.component.UIComponentBase.isRendered(UIComponentBase.java:1212)

- Stack Trace

java.lang.NullPointerException
    at javax.faces.component.UIComponentBase.isRendered(UIComponentBase.java:1212)
    at javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:504)
    at org.apache.myfaces.shared.renderkit.RendererUtils.renderChildren(RendererUtils.java:688)
    at org.apache.myfaces.shared.renderkit.html.HtmlGroupRendererBase.encodeEnd(HtmlGroupRendererBase.java:150)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:675)
    at javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:555)
    at javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:551)
    at javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:551)
    at javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:551)
    at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1891)
    at org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:313)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:58)
    at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:116)
    at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:267)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:200)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)

MyFaces 的新增更新: 声明式 ValueExpression 工作:

<h:panelGroup id="panelId0" rendered="#{testNull.testNullRender}">

仅与程序化 ValueExpression 相关

String valueExpression = "#{testNull.testNullRender}";
        panel.setValueExpression(PropertyConstants.RENDERED, createValueExpression(valueExpression, Boolean.class));

        addComponent("form:panelId", panel);

【问题讨论】:

    标签: jsf nullpointerexception myfaces


    【解决方案1】:

    如果您将 testNullRender 更改为原语,它应该可以正常工作。我不确定规范中是否支持布尔作为对象。

    【讨论】:

    • 我一直在尝试解决相同的问题,因为 Mojarra 和 MyFaces 规范的两种实现具有不同的行为,而且它似乎是 MyFaces 中的一个错误。
    • 我不确定这是否是一个错误。渲染=空是什么意思? true 和 false 实际上是 IMO 唯一可能的值。
    • 声明式 ValueExpression 的工作方式与 Mojarra 类似。问题仅在于 MyFaces 中的 Programmatic ValueExpression。
    • 我注意到这个问题是因为我们使用程序化 ui 组件来制作具有自定义数据结构的动态问卷。
    • xhmtl 中的 在 MyFaces 中也应该给出相同的错误。但它没有任何异常。
    猜你喜欢
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    相关资源
    最近更新 更多