我有一个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相同。
您可以使用OmniFaces SelectItemsConverter
。默认情况下,它通过对象的toString()
表示形式,直接根据<f:selectItems>
中的可用值转换提交的值。因此,如果你能保证你能提供一个唯一的toString()
表示,那么这个转换器就应该这样做。额外的好处是,这个转换器根本不会碰到DB。
在Web应用程序的运行时类路径中删除OmniFacesJAR之后,这只是的问题
<h:selectOneMenu ... converter="omnifaces.SelectItemsConverter">
而不需要任何额外的配置或代码。另请参见展示示例。