我正在尝试从以下位置迁移简单的 JSF2.2 原型Mojarra2.2.5(...工作正常...)MyFaces2.2.3 但是空指针异常 occurs.
我通常使用 Mojarra 做的是包含(注入)以编程方式容器内的 JSF 页面。
示例包含页面(包含.xhtml) is:
<h:panelGroup id="container">
</h:panelGroup>
<h:form>
<h:commandButton value="Include page" action="#{inclusion.include('included.xhtml')}" />
</h:form>
The included page (包含.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
位置=/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)
/inclusion.xhtml 第 15 行第 91 列
action="#{inclusion.include('included.xhtml')}" - 状态大小: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) 处
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.ELException:java.lang.NullPointerException at
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 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) 处
sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) at
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 更多
你有什么想法 ?
有错误吗?
Thanks.
这不是一个错误。使用 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);
vdl.createComponent(...) 是在 JSF 2.2 中添加的,并且在 MyFaces 中它经过改进以允许这种用法。您甚至可以通过这种方式以编程方式添加复合组件。在 MyFaces 用户列表中,据报道这种方式效果非常好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)