私は JSF 2 と JBoss EL (jboss-el-2.0.0.GA.jar) を使用しています。xhtml ページでコンポーネントと一緒にコンバーターを明示的に宣言したい状況で、カスタム コンバーターを動作させるのに問題があります。私はすでにウェブ上にこのような例がたくさんあることを知っており、私はそれらのかなりの数 (このようなもの) をレビューしましたが、運が悪かったため、この問題は特に苛立たしいものになっています。また、注釈のforClass
要素を使用してカスタム コンバーターを実装しましたが、機能します。要素FacesConverter
を使用することを除いて、明示的に宣言されたコンバーターに対して同じ方法を実行しました。forClass
代わりに、value
要素を使用しているか、まったく使用していません。
value
要素の有無にかかわらず、単純なクラス名と完全修飾クラス名、大文字の最初の文字と小文字の最初の文字を使用し、converter
属性と<f:converter>
タグを使用して、 (一見) 注釈のすべての組み合わせを試しました。私が読んだことから、これらのことのいくつかはどちらにしても違いを生むべきではありませんが、他に何をすべきかわからないためにそれらを試しました。Eclipse は、「コンバーター ID が登録されていません」と警告し続けます。とにかく実行します (Eclipse がエラーを出す他の状況を見たことがありますが、実際にはエラーはありませんでした) NullPointerException
。なぜこれが機能しないのですか?これが私のコードの1つのバージョンです:
コンバータークラス
@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>
私が確信していないことの 1 つは、それが私の問題に違いをもたらすかどうかわからないことですが、これらのコンバーターに@ManagedBean
およびを追加する必要があるかどうかです。@ApplicationScoped
SOでこれに関する他の質問を見てきましたが、絶対に必要なもの、良い習慣とは何か、すべきでないことについて明確なビジョンをまだ持っていません。この特定のコンバーターはステートレスであるため、どのスコープを使用するかを決定しようとしているのではなく、1 つを宣言するかどうかを決定しようとしていません (宣言についても同じです@ManagedBean
)。これらの注釈の 1 つまたは両方を削除しようとしましたが、修正されませんでした。この時点で、私は暗闇の中で刺しているように感じます。
編集
それが役立つ場合、実行しようとした後のスタックトレースは次のとおりです。
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