gpt4 book ai didi

validation - JSF (PrimeFaces) 中的转换器与 SelectOneMenu : Validation Error

转载 作者:行者123 更新时间:2023-12-01 09:59:30 28 4
gpt4 key购买 nike

我正在使用 PrimeFaces 在 JSF 中创建一个项目,但我遇到了 <p:SelectOneMenu> 的问题,特别是将选定值从对象转换为字符串。我已经编写了必需的 Converter 类,实现了 toString()equals()我认为,方法非常正确。然而,在 <h:messages />它无休止地给我的组件:

j_idt7:j_idt92: Validation Error: Value is not valid
j_idt7:j_idt98: Validation Error: Value is not valid

我必须选择属于一个更大形式的值。然后,根据选定的所有者 (właściciel) 和公司 (firma),我将它们添加到数据库中。

这是我的 <p:SelectOneMenu> (两次 - 两个菜单):

<p:selectOneMenu value="#{wniosek.selectedWl}" var="w">
<f:selectItem itemLabel="Wybierz" itemValue=""/>
<f:selectItems value="#{wniosek.listaWl}" var="wlasciciel"
itemLabel="#{wlasciciel.nazwisko}" itemValue="#{wlasciciel}" />

<p:column>
#{w.nazwisko}
</p:column>
<f:converter converterId="WlascicielConverter" />
</p:selectOneMenu>
<h:outputText value="Nazwa firmy: "/>

<p:selectOneMenu value="#{wniosek.selectedFi}" var="f">
<f:selectItem itemLabel="Wybierz" itemValue=""/>
<f:selectItems value="#{wniosek.listaFi}" var="firma"
itemLabel="#{firma.nazwa}" itemValue="#{firma}" />
<f:converter converterId="FirmaConverter" />
<p:column>
#{f.nazwa}
</p:column>
</p:selectOneMenu>

这是我的所有者 <p:SelectOneMenu> 的转换器类(类似地,我已经完成了公司的一个):

public class WlascicielConverter implements Converter {

int i = 0;
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
try {
if (arg2 == null || arg2.isEmpty()) {
return null;
}
String owner = arg2;
return WlascicielBean.findAnOwner(owner);

} catch (SQLException e) {
e.printStackTrace();
return null;
}
}

@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {

if(arg2 == null) return null;

Wlasciciel owner = new Wlasciciel();

if(arg2 instanceof Wlasciciel) {
owner = (Wlasciciel)arg2;
System.out.println(owner.getNazwisko());
String surname = owner.getNazwisko();
return (surname != null) ? String.valueOf(surname) : null;
} else throw new ConverterException("Something wrong!" + arg2.hashCode() + arg2.toString());

}

equals()方法:

@Override
public boolean equals(Object obj) {
if (obj == this) return true;
if (!(obj instanceof Wlasciciel)) return false;

Wlasciciel wl = (Wlasciciel)obj;
if (this.id_w != wl.getId_w()) return false;
if (!this.nazwisko.equals(wl.getNazwisko())) return false;
if (!this.imie.equals(wl.getImie())) return false;
if (!this.ulica.equals(wl.getUlica())) return false;
if (this.nr != wl.getNr()) return false;
if (this.lokal != wl.getLokal()) return false;
if (this.id_n != wl.getId_n()) return false;

return true;
}

你能给我一些解决这个问题的提示吗?我已经阅读了很多关于 JSF 转换器的教程,尝试了很多方法来改进它,但它仍然不起作用。我不知道...也许问题出在我的代码中的其他地方?由于它的长度,我不会在这里粘贴它(当然,如果有必要,我会这样做)。

最佳答案

总的来说,我认为你的方法是正确的,尽管非英语代码真的很难理解你在那里实际做什么......

发生的事情是:你有一些东西的集合。您的 Converter 遍历该集合并在每个对象上调用 getAsString()。在浏览器中选择内容后,(getAsString() 的返回值)将被传输到转换器,getAsObject() 将叫做。这是一个全新的对象,不一定是以前的集合之一(除非您的 Converter 实际上会访问该集合并从那里获取它)。之后,JSF 将获取它用于生成 selectOneMenu 的集合,并将每个项目与转换器返回的项目进行比较。

这可能通过 equals()hashCode() 发生,具体取决于所使用的集合。所以你需要同时覆盖两者(你实际上总是应该这样做)。

如果 JSF 无法从集合中找到任何与转换器返回的对象相匹配的对象(等于为真,或者 hashCode 相同),那么您将得到验证错误:值无效.

我希望这个过程稍微清楚一点。我的猜测是您必须实现 hashCode(),或者您的 equals() 方法是错误的。总体设置是正确的。您需要调试并检查 JSF 为何无法在您的列表中找到该对象。

关于validation - JSF (PrimeFaces) 中的转换器与 SelectOneMenu : Validation Error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18422134/

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