2

我正在使用 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
4

0 回答 0