我正在使用 JSF 2 和 JBoss EL (jboss-el-2.0.0.GA.jar)。在我想在我的 xhtml 页面中的组件旁边显式声明转换器的情况下,我无法让自定义转换器工作。我知道网上已经有很多这样的例子,而且我已经审查了很多(比如这个),但没有运气,这使得这个问题特别令人沮丧。另外,我已经使用注释forClass
元素实现了一个自定义转换器,它可以工作。除了使用元素FacesConverter
之外,我对显式声明的转换器做了同样的事情。forClass
相反,我正在使用该value
元素或根本不使用。
我已经尝试(看似)所有注释组合:有和没有value
元素,使用简单的类名和完全限定的类名,大写首字母和小写首字母,以及使用converter
属性和<f:converter>
标签。从我所读到的内容来看,其中一些事情不应该以某种方式产生影响,但我尝试了它们,因为我不知道还能做什么。Eclipse 不断警告我“转换器 ID 未注册”。无论如何我都会运行它(因为我见过 Eclipse 给出错误的其他情况,但实际上没有错误),但它会抛出一个NullPointerException
. 为什么这不起作用?这是我的代码的一个版本:
转换器类
@FacesConverter(value = "MyConverter")
@ManagedBean
@ApplicationScoped
public class MyConverter implements Converter {
...
}
XHTML 页面
<h:selectOneRadio value="#{myBean.myProperty}"
layout="pageDirection"
required="true"
requiredMessage="#{myBean.requiredMessage}"
converter="MyConverter"
id="#{myBean.myPropertyId}" >
<!-- OTHER THINGS I'VE TRIED -->
<!-- <f:converter converterId="MyConverter" /> -->
<!-- <f:converter converterId="myConverter" /> -->
<!-- <f:converter converterId="myPackage.MyConverter" /> -->
<f:selectItems value="#{myBean.myPropertyOptions}" />
</h:selectOneRadio>
我不确定的一件事,我不确定它是否对我的问题有影响,是我是否应该或不应该向这些转换器添加@ManagedBean
和。@ApplicationScoped
我在 SO 上看到过其他关于此的问题,但我仍然对什么是绝对必要的、什么是好的做法以及不应该做的事情没有清晰的认识。这个特定的转换器是无状态的,所以我不是要确定要使用哪个范围,而是要确定是否要声明一个(声明相同@ManagedBean
)。我也尝试删除这些注释中的一个或两个,但它没有修复它。在这一点上,我觉得我只是在黑暗中刺伤。
编辑
如果有帮助,这是尝试运行后的堆栈跟踪:
javax.faces.FacesException: java.lang.NullPointerException
at org.apache.myfaces.shared_impl.context.ExceptionHandlerImpl.wrap(ExceptionHandlerImpl.java:241)
at org.apache.myfaces.shared_impl.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:156)
at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:258)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:191)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:679)
Caused by: java.lang.NullPointerException
at org.apache.myfaces.shared_impl.renderkit.html.HtmlRadioRendererBase.renderGroupOrItemRadio(HtmlRadioRendererBase.java:213)
at org.apache.myfaces.shared_impl.renderkit.html.HtmlRadioRendererBase.encodeEnd(HtmlRadioRendererBase.java:118)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:519)
at org.apache.myfaces.shared_impl.renderkit.RendererUtils.renderChild(RendererUtils.java:543)
at org.apache.myfaces.shared_impl.renderkit.html.HtmlGridRendererBase.renderChildren(HtmlGridRendererBase.java:315)
at org.apache.myfaces.shared_impl.renderkit.html.HtmlGridRendererBase.encodeEnd(HtmlGridRendererBase.java:150)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:519)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:618)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:614)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:614)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:614)
at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1159)
at org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:263)
at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:85)
at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:239)
... 13 more