gpt4 book ai didi

非持久化实体的 JSF 转换器

转载 作者:行者123 更新时间:2023-12-04 04:48:52 27 4
gpt4 key购买 nike

我有一个使用以下方法的 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 相同。

最佳答案

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

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

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

没有任何额外的配置或代码。另见 the showcase example .

关于非持久化实体的 JSF 转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17737462/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com