用于非持久化实体的JSF转换器

用于非持久化实体的JSF转换器,jsf,converter,selectonemenu,Jsf,Converter,Selectonemenu,我有一个JSF转换器,其方法如下: @Override public Object getAsObject(FacesContext context, UIComponent component, String value) { Actor a = getEjbCasos().getActorByName(value); return a; } 这是从SelectOne菜单调用的: <h:selectOneMenu id=

我有一个JSF转换器,其方法如下:

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

        Actor a = getEjbCasos().getActorByName(value);        
        return a;
    }
这是从SelectOne菜单调用的:

<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>

用户可以输入新的参与者名称,而不是选择参与者,这将创建一个新的参与者实体,但不会将其持久化到数据库中。然后将此参与者名称添加到actorRows列表中,以便下次可以选择它

我遇到的问题是,由于用户创建的参与者没有被持久化到数据库中,当他们选择这个参与者时,转换器返回null。我不知道如何告诉转换器此引用应该与第一个参与者相同。

您可以使用
SelectItemsConverter
。默认情况下,它通过对象的
toString()
表示直接基于
中的可用值转换提交的值。因此,如果您可以保证您可以提供唯一的
toString()
表示,那么这个转换器就应该这样做。额外的好处是,这个转换器根本没有击中数据库

在将OmniFaces JAR放到webapp的运行时类路径中之后,这只是一个简单的问题

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

没有任何额外的配置或代码。另见