次の選択メニューがあります。私は "Intezet"(Institution)オブジェクト用のコンバータを持っています。属性編集可能がtrueの場合、SelectOneMenuはitemValueの代わりにitemLabelを渡します
<p:selectOneMenu id="bekuldo" filter="true" filterMatchMode="contains" required="true" converter="intezetConverter" disabled="#{iratFelvitelView.disabled}" value="#{iratFelvitelView.bekuldo}" placeholder="Válaszd ki vagy add meg!" editable="true">
<f:selectItem noSelectionOption="true" itemLabel="Válassz egyet:" itemValue="#{null}" itemDisabled="#{iratFelvitelView.bekuldo ne null}" />
<f:selectItems value="#{dataFromDBean.intezetek}" var="intezet" itemLabel="#{intezet.name}" itemValue="#{intezet}" />
</p:selectOneMenu>
@FacesConverter(value = "intezetConverter")
public class IntezetConverter implements Converter {
@Override
public Object getAsObject(FacesContext ctx, UIComponent uiComponent, String id) {
ValueExpression vex = ctx.getApplication().getExpressionFactory().createValueExpression(ctx.getELContext(),
"#{dataFromDBean}", DataFromDBean.class);
DataFromDBean objects = (DataFromDBean) vex.getValue(ctx.getELContext());
Intezet object = null;
try {
UUID guid = UUID.fromString(id);
object = objects.getIntezet(guid);
} catch (IllegalArgumentException e) {
e.printStackTrace();
object = new Intezet(id);
}
return object;
}
@Override
public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object obj) {
if (obj == null)
return "";
if (obj.getClass().equals(String.class)) {
return (String) obj;
}
return ((Intezet) obj).getId().toString();
}
}
そしてgetAsObject
に呼び出されるコンストラクタされています。基本的に私のロジックはselectOneMenu
は、ユーザが選択可能な値として、既存のオブジェクトを使用し、また、新しい値を追加することである
public Intezet(String name) {
super();
this.id = UUID.randomUUID();
this.name = name;
this.passziv = false;
}
これはStringであり、Stringが渡された場合、idが見つからないため、文字列はidとして渡されます。次に、idをUUIDに解析できない場合は、UUID文字列ではありません、新しいオブジェクトが作成され、フォームの送信時にサーバーによって保存されます。
しかし、問題はeditable="true"
が存在する場合、selectOneMenu
は常にコンバータにString
を渡し、それだけではない任意のString
が、機関の名称で表現したものですitemLabel
値、ということ、です。 noselectoptionもitemLabelとして渡され、決して#{null}
となります。 したがって、ユーザーが新しい値を入力するか、既存の値を選択しても、常にitemLabel
属性がコンバーターに渡されるため、マイナーコンバータは新しい値として認識し、新しい機関を作成しようとします。これはJSF
またはPrimeFaces
の既知のバグですか?うさぎ宮本、<p:autoComplete>
によって示唆されるように
は私の問題に対する回避策です。
public Collection<Intezet> completeIntezet(String query) {
Collection<Intezet> filteredIntezet = new ArrayList<>();
for (Intezet intezet : intezetek) {
if (intezet.getName().toLowerCase().contains(query.toLowerCase().trim())) {
filteredIntezet.add(intezet);
}
}
return filteredIntezet;
}
として、 'Java' /' XHTML'ソースを表示するには、 'HTML' /' JavaScript'/'CSS'スニペットを使用しないでください。それらは実行されません... –
代わりに '
'を使用する必要があります... –
@UsagiMiyamotoそれは豆とサーバーのいずれかがなくても実行されませんが、代わりに何を使うべきですか?私はstackoverflowを新しくしました –