我试图将简单的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.ELException: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.ELException: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.ELException: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更多
你怎么看?
有没有错误?
感谢。
答案 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用户列表中,据报道这种方式非常有效。