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 列表中,以便下次可以选择它。

我遇到的问题是,由于用户创建的 Actor 尚未保存到数据库中,因此当他们选择此 Actor 时,转换器返回 null。我不确定如何告诉转换器这个引用应该与第一个 Actor 相同。

4

1 回答 1

3

您可以为此使用OmniFaces SelectItemsConverter<f:selectItems>默认情况下,它通过对象的表示形式根据可用值直接转换提交的值toString()。所以如果你能保证你可以提供一个唯一的toString()表示,那么这个转换器就应该这样做。额外的好处是这个转换器根本不会击中数据库。

在 webapp 的运行时类路径中删除 OmniFaces JAR 后,只需

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

无需任何额外的配置或代码。另请参见展示示例

于 2013-07-19T03:16:00.133 回答