MyFaces面包含中的NullPointerException [英] NullPointerException in MyFaces facelet inclusion

查看:91
本文介绍了MyFaces面包含中的NullPointerException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


我正在尝试将简单的JSF2.2原型从 Mojarra 2.2.5(...可以正常工作...)迁移到 MyFaces 2.2.3,但是将 > NullPointerException .
我通常使用Mojarra进行的操作是在容器中以编程方式包括(注入) 一个JSF页面.


I'm trying to migrate simple JSF2.2 prototype from Mojarra 2.2.5 (... where works fine ...) to MyFaces 2.2.3 but a NullPointerException occurs.
What I normally do using Mojarra is to include (inject) programmatically a JSF page within a container.

样本收录页面( inclusion.xhtml )是:

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

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

The included page (included.xhtml) contains something like:

    <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

javax.el.ELException: java.lang.NullPointerException

viewId =/inclusion.xhtml 位置=/opt/jbdevstudio7/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/jsf2test/inclusion.xhtml phaseId = INVOKE_APPLICATION(5)

viewId=/inclusion.xhtml location=/opt/jbdevstudio7/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/jsf2test/inclusion.xhtml phaseId=INVOKE_APPLICATION(5)

由以下原因引起:java.lang.NullPointerException- java.lang.NullPointerException在 org.apache.myfaces.view.facelets.impl.FaceletCompositionContextImpl.generateUniqueId(FaceletCompositionContextImpl.java:1045)

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

/inclusion.xhtml在第15行和第91列 action =#{inclusion.include('included.xhtml')}"-状态大小:0字节

/inclusion.xhtml at line 15 and column 91 action="#{inclusion.include('included.xhtml')}" - State size:0 bytes

这是 stacktrace :

org.apache.myfaces.view.facelets.el.ContextAwareELException: javax.el.E​​LException:java.lang.NullPointerException在 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)在 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)处 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)在 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在 org.apache.el.parser.AstValue.invoke(AstValue.java:291)在 org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274) 在 org.apache.myfaces.view.facelets.el.ContextAwareTagMethodExpression.invoke(ContextAwareTagMethodExpression.java:96) ... 33更多原因于:java.lang.NullPointerException 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)在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)位于 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在java.lang.reflect.Method.invoke(Method.java:597)在 org.apache.el.parser.AstValue.invoke(AstValue.java:278)...还有35个

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

您如何看待?
有bug吗?
谢谢.

What do you think about ?
Is there a bug ?
Thanks.

推荐答案

这不是错误.使用FaceletContext是错误的方法,因为稍后它会导致重复的id和状态管理问题,而该问题没有解决方案,因为从一开始代码就是错误的.相反,请尝试使用这种方式:

It is not a bug. Use FaceletContext is the wrong way to do it, because later it causes duplicate id and state management issues, that does not have solution because from start the code is wrong. Instead, try use this way:

        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用户列表中,这种方式非常有效.

vdl.createComponent(...) was added in JSF 2.2, and in MyFaces it was improved to allow this usage. You can even add composite components programmatically in this way. In MyFaces users list it has been reported that this way works very well.

这篇关于MyFaces面包含中的NullPointerException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆