豆がビュースコープされているとき、私は奇妙な問題に直面しています。state_Saving_method が client に設定されている場合、コンバーターは指定された型に値を設定していません。「サーバー」に設定されている場合は完全に機能し、Beanがリクエストスコープで「クライアント」に設定されている場合も正常に機能します
ウェブページはこんな感じ。
<h:selectOneMenu value="#{managedBeanState.selectedFoo}" >
<f:selectItem itemLabel="" />
<f:selectItems value="#{managedBean.foos)" var="foo" itemLabel="#{foo.name} " itemValue="#{foo}" />
<f:converter converterId="fooConverter" />
<p:ajax update="whom" onstart="menuStart();" oncomplete="menuComplete();" />
</h:selectOneMenu>
<h:selectOneMenu id="whom" value="#{managedBeanState.person}"
disabled="#{empty managedBeanState.selectedFoo}">
<f:selectItem itemLabel="" />
<f:selectItems value="#{managedBean.persons)" var="person" itemLabel="#{person.name} " itemValue="#{person}" />
<f:converter converterId="personConverter" />
<p:ajax update="email" onstart="menuStart();" oncomplete="menuComplete();" />
</h:selectOneMenu>
コンバーター クラスは次のようになります。
@FacesConverter(value = "fooConverter", forClass = com.examples.Foo.class)
public class EntityConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent c, String value) {
if (value.isEmpty()) {
return null;
}
try {
SessionFactory sessionFactory = (SessionFactory) FacesContextUtils.getRequiredWebApplicationContext(FacesContext.getCurrentInstance()).getBean("sessionFactory");
String[] idAndClassName = value.split(":|_");
String className = idAndClassName[1];
String id = idAndClassName[0];
return sessionFactory.getCurrentSession().load(Class.forName(className), Long.parseLong(id));
} catch(Exception e) {
throw new IllegalStateException("Error loading from value:" + value, e);
}
}
@Override
public String getAsString(FacesContext context, UIComponent c, Object value) {
if (value == null || StringUtils.isEmpty(value.toString())) {
return StringUtils.EMPTY;
}
return ((Foo) value).getId().toString() + ":" + value.getClass().getName();
}
}
私のweb.xmlは次のようになります
<context-param>
<description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
<context-param>
<param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
<param-value>false</param-value>
</context-param>
BalusCブログを確認しまし たが、PARTIAL_STATE_SAVING を false に設定しても解決しませんでした。また、デバッグ モードで実行したところ、getAsObject が実際にオブジェクトを返していることがわかりましたが、その後、セッターは呼び出されません。そのため、この disabled="#{empty managedBeanState.selectedFoo}" をチェックする 2 番目のドロップダウン メニューに対してゲッターが呼び出されると、常に null になります。
更新: JIRAで問題を作成しました