TomcatでJSFアプリを実行しています。render
属性によってリンクされている3つのリストがあります。
<h:selectOneMenu id="selectedCategory" value="#{converterBean.selectedCategory}">
<f:ajax execute="selectedCategory" render="selectedFrom"/>
<f:selectItems value="#{converterBean.categories}"/>
</h:selectOneMenu>
<h:selectOneListbox id="selectedFrom" value="#{converterBean.selectedFrom}" size="5">
<f:selectItems value="#{converterBean.fromList}"/>
<f:ajax execute="selectedCategory selectedFrom" render="selectedTo"/>
</h:selectOneListbox>
<h:selectOneListbox id="selectedTo" value="#{converterBean.selectedTo}" size="5">
<f:selectItems value="#{converterBean.toList}"/>
</h:selectOneListbox>
クリックするとうまくselectedCategory
レンダリングされselectedFrom
ます。その中の項目を選択するとselectedFrom
、以下のようなエラーが発生します。
重大:javax.el.ELException:/converter.xhtml @ 44,53 value = "#{converterBean.toList}":タイプcom.primesystems.beans.ConverterBeanの「toList」の読み取り中にエラーが発生しました
より多くのスタックトレースを取得したいのですが、デバッガーで実行し、Tomcat関連のアペンダーにlog4jを追加し、beanメソッドをtry/catchで囲むのは適切ではありません。
私はmojarraバージョン2.1.7と2.2.0-m05の両方が同じ動作をすることを試しました。
コードに問題があり、converterBean.getToListメソッドで例外をキャッチしてスタックトレースをキャプチャできました。だから私が持っていた問題は解決されました。
以下にコメントをお願いします。以下のロケーターはコンバーターBeanに注入され、Conveterクラスはシリアル化できないため、シリアル化に関連する例外が発生することがあるため、以下のロジックを追加しました。
@ManagedBean(name="serviceLocater")
@ApplicationScoped
public class LocalServiceLocater implements ServiceLocater, Serializable {
transient private Converter converter;
public LocalServiceLocater() {
converter = new Converter();
}
public Converter getConverter() {
// TODO Auto-generated method stub
return converter;
}
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException {
in.defaultReadObject();
converter = new Converter();
}
}
また、同じ質問をもう1つ追加したいと思います。カテゴリを選択すると、fromリストとtoリストの両方を更新する必要があります。現在、カスケードすることを期待してコーディングしていますが、リストからのみ更新されます。fromとtoの両方をカテゴリajaxrender属性にレンダリングしようとしましたが、代わりに2つのリクエストを実行したいのに、古いfromカテゴリを 送信します。最初にリストから入力するカテゴリを指定します。カテゴリ付きの2番目のリクエスト、fromからtoリストへの入力。