【发布时间】:2013-02-01 21:10:08
【问题描述】:
我有一个简单的 JSF 2.0 xhtml 页面,当我插入 h:form 标记时它不会呈现。我可以使用普通的标签,一切都很好。
这是我的规格: - Java 1.6 - WebSphere 8.0.0.5 及其内置的 Apache MyFaces 2.0.4 - PrimeFaces 3.4.2 - OmniFaces 1.3 - 我必须支持 HTML 5 标签,所以我正在使用
这是简单的测试页面:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>This is a test page</title>
</h:head>
<h:body>
<h:form></h:form>
</h:body>
</html>
我还使用 NetBeans 和 Tomcat 7 测试了这个测试页面,其中 MyFaces 2.0.4 被列为依赖项,PrimeFaces 和 OmniFaces 依赖项从我的 pom 中取出,以确保两者都不会导致问题。页面仍然不会呈现。
注意将 DOCTYPE 更改为典型:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
也不行。
这是错误:
javax.faces.FacesException:java.lang.NullPointerException:serialFactory 在 org.apache.myfaces.shared_impl.context.ExceptionHandlerImpl.wrap(ExceptionHandlerImpl.java:241) 在 org.apache.myfaces.shared_impl.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:156) 在 org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:258) 在 javax.faces.webapp.FacesServlet.service(FacesServlet.java:191) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 在 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:472) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) 在 org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1813) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 在 java.lang.Thread.run(Thread.java:722) 引起:java.lang.NullPointerException:serialFactory 在 org.apache.myfaces.shared_impl.util.StateUtils.getAsByteArray(StateUtils.java:268) 在 org.apache.myfaces.shared_impl.util.StateUtils.construct(StateUtils.java:235) 在 org.apache.myfaces.renderkit.html.HtmlResponseStateManager.writeViewStateField(HtmlResponseStateManager.java:120) 在 org.apache.myfaces.renderkit.html.HtmlResponseStateManager.writeState(HtmlResponseStateManager.java:111) 在 javax.faces.render.ResponseStateManager.writeState(ResponseStateManager.java:67) 在 org.apache.myfaces.application.jsp.JspStateManagerImpl.writeState(JspStateManagerImpl.java:598) 在 javax.faces.application.StateManager.writeState(StateManager.java:200) 在 org.apache.myfaces.application.ViewHandlerImpl.writeState(ViewHandlerImpl.java:302) 在 javax.faces.application.ViewHandlerWrapper.writeState(ViewHandlerWrapper.java:65) 在 javax.faces.application.ViewHandlerWrapper.writeState(ViewHandlerWrapper.java:65) 在 org.apache.myfaces.shared_impl.renderkit.html.HtmlFormRendererBase.encodeEnd(HtmlFormRendererBase.java:179) 在 javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:519) 在 javax.faces.component.UIComponent.encodeAll(UIComponent.java:626) 在 javax.faces.component.UIComponent.encodeAll(UIComponent.java:622) 在 javax.faces.component.UIComponent.encodeAll(UIComponent.java:622) 在 org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1320) 在 org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:263) 在 javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:59) 在 javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:59) 在 org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:85) 在 org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:239) ... 17 更多
我注意到该问题已在 MyFaces 2.0.6 中得到解决。问题是我被束缚在 WAS v8 的 MyFaces 2.0.4 上。我需要使用 WAS v8 的内置 CDI,所以我可以将它与 EJB 3.1 结合使用。您只能将内置 CDI 与内置 MyFaces 一起使用(WAS v8 手册中这样说)。
对解决方法有什么建议吗?我可以改用简单的<form> 标签吗?当我使用 <form> 标签时,我没有看到任何 MyFaces 错误。
【问题讨论】:
-
请使用更新版本的 MyFaces。最新版本(2.0.16/2.1.11)被认为是迄今为止最稳定的版本。
-
2.1 应该会更好。 2.1.10 可以在 maven repo 中找到
-
好吧,如果我真的可以使用最新的 2.0/2.1 版本的 MyFaces,我会的。哎呀,我使用 Mojarra 的 JSf 2.2 作为应用程序的 POC。虽然我不能升级。我坚持使用 WebSphere v8.0.5。如果我想利用 JEE 6 的 CDI,你必须使用 WAS 8 的内置 MyFaces 2.0.4。是的,我可以通过将类加载器策略设置为 PARENT_LAST 或共享库来覆盖 2.0.4,但是我失去了能够使用 CDI 的好处。在 WAS v8 中,这是他们的 CDI 实现,或者什么都没有。你不能覆盖它。我没有使用没有 CDI 的 JSF 2.0 与 EJB 3.1 和 JPA 2 结合使用。
-
更正,我使用的是 WAS v8.0.0.5。我还想补充一点,添加常规的
<form>标签不是合适的解决方法。虽然编译器不会抱怨该标签的存在,但 JSF 将在运行时呈现一条警告消息,说明需要 JSF 表单。我正在尝试找出解决此问题的方法。一个救恩是 WAS v8.0.0.6 在 4 月发布,尽管在当前时间点这对我没有好处。
标签: html jsf-2 primefaces myfaces omnifaces