p:selectOneMenu
(Primefaces 3.0)のAJAX呼び出し中に、JBoss-7.1.0.CR1bでカスタム@FacesConverter
の奇妙な問題が発生しました。@FacesConverterは、p:selectOneMenuとp:ajaxのメソッド呼び出しを防止します
簡略化ConverterはNPEまたは他の例外なしには、コンバータがp:selectOneMenu
に使用されている
@FacesConverter("MyConverter")
public class MyConverter implements Converter
{
public Object getAsObject(FacesContext fc, UIComponent uic, String value)
{
logger.debug("getAsObject value: "+value);
if (submittedValue.trim().equals("")) {return null;}
else
{
MyEjb ejb = new MyEjb();
ejb.setId(Long.parseLong(value()));
return ejb; //**** alternative with return null; ****
}
}
public String getAsString(FacesContext fc, UIComponent uic, Object value)
{
if (value == null || value.equals("")) {return "";}
else
{
MyEjb ejb = (MyEjb)value;
return ""+ejb.getId();
}
}
}
このクラスではありません、次のようになります。
<h:form>
<p:selectOneMenu value="#{clientBean.selected}" converter="MyConverter">
<f:selectItems value="#{clientBean.all}" var="my"
itemLabel="#{my.name}" itemValue="#{my}"/>
<p:ajax listener="#{clientBean.changed}" />
</p:selectOneMenu>
</h:form>
ロケット工学ではありません、変更メソッドは単純にデバッグを行います:
public void changed()
{
logger.info("changed() "+selected);
}
しかし、今は迷惑な一部:changed()
は、上記のようなコードで呼び出されることはありませんが、私は、コンバータは回呼び出されます:私はlong selectedId
からp:selectOneMenu value="#{clientBean.selectedId}"
を変更し、メソッドが呼び出されるコンバータを使用しない場合は
12:37:51,500 DEBUG getAsObject value: 35
12:37:51,502 DEBUG getAsObject value:
12:37:51,503 DEBUG getAsObject value:
を一度。 return null
がgetAsObject()
であっても、changed()
が呼び出されます(1回だけ)。私はh:selectOneMenu
とf:ajax
を使っても同じ動作をするので、Primefacesに関連するとは思わない。
@Ondra:この問題はJBoss AS 7にどのくらい関係していますか?この方法では、この問題が他のサーバーには現れていないことを暗示しています。これは、この特定の問題では間違っています。 – BalusC