NetBeans 7.1.1 JSF2.1
在 h:selectManyCheckBox 中使用 converter="convK" 属性时,一切正常。但我尝试使用 @FacesConverter(forClass=className.class) 表单,它不断给我“验证无效”错误。我尝试将其更改为 forClass=packageName.className.class 但没有帮助。
这是转换器:
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
@FacesConverter( "convK")
public class KorisnikConverter implements Converter{
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value==null) return value;
if (value.isEmpty()) return value;
for (int i=0; i<Arhiva.getSviKor().size(); i++) {
if (Arhiva.getSviKor().get(i).getUsername().equals(value)) {
return Arhiva.getSviKor().get(i);
}
}
return value;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value==null) return "";
if (value instanceof Korisnik) return ((Korisnik)value).getUsername();
return "";
}
}
我有一个名为 Korisnik 的类,它有几个文本字段,用户名是唯一的。在我的主要管理 bean 中,我有几个这些对象的 arrayList。目标是使用 selectManyCheckBox 仅选择一些用户并将它们放在单独的数组列表中以供其他用途。我想推动整个对象(我总是可以轻松地使用字符串并在我的控制器 bean 中创建和管理对象,但想尝试自定义转换器来让 selectItems 与对象一起工作)
在我的课堂上,我已经覆盖了 equals 和 hashCode(因为有很多关于自定义转换器给出等等等等验证不是有效错误的讨论)。
@Override
public boolean equals (Object obj) {
if (obj==null) return false;
if (!(obj instanceof Korisnik)) return false;
Korisnik k = (Korisnik)obj;
return (this.username==k.username);
}
@Override
public int hashCode() {
return this.username.hashCode();
}
编辑。当我将它用作命名转换器并仅在具有 selectManyCheckbox 的一个实例中使用所述转换器时,即使没有覆盖 equals 和 hashCode,它也可以正常工作。
这是复选框代码
<h:selectManyCheckbox value="#{kontrolg.izabrAut}" layout="pageDirection" converter="convK" >
<f:selectItems value="#{kontrolg.moguciAut}" var="it" itemLabel="# {it.ime} #{it.prezime}" itemValue="#{it}"/>
</h:selectManyCheckbox>
我不知道是我没有在转换器注释中正确使用 forClass="whatever" 还是我的转换器实际上可以与那个 selectManyCheckbox 一起工作,但是当我以 forClass 形式指定它时,它会被用于所有实例对象并导致在添加自定义转换器之前运行良好的其他代码现在给出“验证无效”错误?