2

次のメソッドを持つ JSF コンバーターがあります。

@Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {

        Actor a = getEjbCasos().getActorByName(value);        
        return a;
    }

これは SelectOneMenu から呼び出されます。

<h:selectOneMenu id="actores" value="#{crearCasosBean.currentActor}">
   <f:selectItem noSelectionOption="true"/>
   <f:selectItems value="#{crearCasosBean.actorRows}" var="actor" itemLabel="#{actor.name}" itemValue="#{actor}"/>   
   <f:converter binding="#{actorConverter}"/>
</h:selectOneMenu>

アクターを選択する代わりに、ユーザーは新しいアクター名を入力できます。これにより、新しいアクター エンティティが作成されますが、データベースには保持されません。この Actor 名は、次回選択できるように、actorRows リストに追加されます。

私が抱えている問題は、ユーザーが作成したアクターがデータベースに永続化されていないため、このアクターを選択するとコンバーターが null を返すことです。この参照が最初のアクタと同じであることをコンバーターに伝える方法がわかりません。

4

1 に答える 1

3

これにはOmniFaces を使用できますSelectItemsConverter。オブジェクトの表現<f:selectItems>を介して、デフォルトで使用可能な値に基づいて、送信された値を直接変換します。toString()したがって、一意の表現を提供できることを保証できる場合toString()、このコンバーターはそれを行う必要があります。追加のボーナスは、このコンバーターが DB にまったくヒットしないことです。

Web アプリケーションのランタイム クラスパスに OmniFaces JAR をドロップした後は、

<h:selectOneMenu ... converter="omnifaces.SelectItemsConverter">

追加の構成やコードは必要ありません。ショーケースの例も参照してください。

于 2013-07-19T03:16:00.133 に答える