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

时间:2013-07-19 03:04:45

标签: jsf converter selectonemenu

我有一个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名称,而不是选择一个actor,这会创建一个新的Actor实体,但不会将其持久保存到数据库中。然后将此Actor名称添加到actorRows列表中,以便下次可以选择它。

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

1 个答案:

答案 0 :(得分:3)

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

在webapp的运行时类路径中删除OmniFaces JAR之后,这只是一个问题

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

没有任何其他配置或代码。另请参阅the showcase example