MyFaces facelet包含中的NullPointerException

时间:2014-06-10 15:43:52

标签: facelets jsf-2.2 myfaces


我试图将简单的JSF2.2原型从 Mojarra 2.2.5(......哪里工作正常......)迁移到 MyFaces 2.2.3但是a发生 NullPointerException 我通常使用Mojarra做的是在容器中包含(注入)以编程方式 JSF页面。

示例包含页面( inclusion.xhtml )是:

<h:panelGroup id="container">
</h:panelGroup>
<h:form>
    <h:commandButton value="Include page" action="#{inclusion.include('included.xhtml')}" />
</h:form>

附带页面( included.xhtml )包含以下内容:

    <h:outputText value="INCLUDED TEXT ..." />

这是托管bean

    @ManagedBean(name="inclusion")
    @RequestScoped
    public final class Inclusion {

    public void include(String contentUrl) throws IOException{
        FacesContext fc = FacesContext.getCurrentInstance();        
        FaceletContext f2ctx = (FaceletContext) fc.getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
        UIComponent uic = fc.getViewRoot().findComponent("container");
        if (uic != null && f2ctx != null) {
            f2ctx.includeFacelet(uic, contentUrl);              
        }
    }

这是例外

  

javax.el.E​​LException:java.lang.NullPointerException

     

viewId = / inclusion.xhtml   位置= /选择/ jbdevstudio7 /工作区/ .metadata / .plugins / org.eclipse.wst.server.core / TMP0 / wtpwebapps / jsf2test / inclusion.xhtml   phaseId = INVOKE_APPLICATION(5)

     

引起:java.lang.NullPointerException -   java.lang.NullPointerException at   org.apache.myfaces.view.facelets.impl.FaceletCompositionContextImpl.generateUniqueId(FaceletCompositionContextImpl.java:1045)

     

/inclusion.xhtml在第15行和第91列   行动=&#34;#{inclusion.include(&#39; included.xhtml&#39;)}&#34; - 状态大小:0字节

这是堆栈跟踪

  

org.apache.myfaces.view.facelets.el.ContextAwareELException:   javax.el.E​​LException:java.lang.NullPointerException at   org.apache.myfaces.view.facelets.el.ContextAwareTagMethodExpression.invoke(ContextAwareTagMethodExpression.java:108)     在   org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:74)     在   org.primefaces.application.DialogActionListener.processAction(DialogActionListener.java:45)     在javax.faces.component.UICommand.broadcast(UICommand.java:120)at   javax.faces.component.UIViewRoot._broadcastAll(UIViewRoot.java:1172)     在   javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:365)     在javax.faces.component.UIViewRoot._process(UIViewRoot.java:1656)     在   javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:862)     在   org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:42)     在   org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:196)     在   org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:143)     在javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)at   org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)     在   org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)     在com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:145)     在   org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)     在   org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)     在jplus.web.filters.FlowFilter.doFilter(FlowFilter.java:215)at   org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)     在   org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)     在   org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)     在   org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)     在   org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)     在   org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)     在   org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)     在   org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)     在   org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)     在   org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)     在   org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)     在   org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:589)     在   org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:312)     在   java.util.concurrent.ThreadPoolExecutor中的$ Worker.runTask(ThreadPoolExecutor.java:886)     在   java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:908)     在java.lang.Thread.run(Thread.java:662)引起:   javax.el.E​​LException:java.lang.NullPointerException at   org.apache.el.parser.AstValue.invoke(AstValue.java:291)at at   org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274)     在   org.apache.myfaces.view.facelets.el.ContextAwareTagMethodExpression.invoke(ContextAwareTagMethodExpression.java:96)     ... 33更多引起:java.lang.NullPointerException at   org.apache.myfaces.view.facelets.impl.FaceletCompositionContextImpl.generateUniqueId(FaceletCompositionContextImpl.java:1045)     在   org.apache.myfaces.view.facelets.impl.DefaultFaceletContext.generateUniqueId(DefaultFaceletContext.java:322)     在   org.apache.myfaces.view.facelets.compiler.UIInstructionHandler.apply(UIInstructionHandler.java:87)     在   javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:46)     在   org.apache.myfaces.view.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:59)     在   org.apache.myfaces.view.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:48)     在   org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:514)     在   org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:568)     在   org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:546)     在   org.apache.myfaces.view.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:240)     在Inclusion.include(Inclusion.java:27)at   sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)     在java.lang.reflect.Method.invoke(Method.java:597)at   org.apache.el.parser.AstValue.invoke(AstValue.java:278)... 35更多

你怎么看? 有没有错误?
感谢。

1 个答案:

答案 0 :(得分:3)

这不是一个错误。使用FaceletContext是错误的方法,因为以后它会导致重复的id和状态管理问题,因为从一开始代码就错了。相反,尝试使用这种方式:

        ViewDeclarationLanguage vdl = facesContext.getApplication().
            getViewHandler().getViewDeclarationLanguage(
                facesContext, facesContext.getViewRoot().getViewId());

        Map<String, Object> attributes = new HashMap<String, Object>();
        attributes.put("src", "/addSimpleIncludeVDL_1_1.xhtml");
        UIComponent component = vdl.createComponent(facesContext, 
            "http://java.sun.com/jsf/facelets", 
            "include", attributes);
        getChildren().add(component);
在JSF 2.2中添加了

vdl.createComponent(...),在MyFaces中,它被改进以允许这种用法。您甚至可以通过这种方式以编程方式添加复合组件。在MyFaces用户列表中,据报道这种方式非常有效。