1

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}&#160;#{it.prezime}" itemValue="#{it}"/>
      </h:selectManyCheckbox>

我不知道是我没有在转换器注释中正确使用 forClass="whatever" 还是我的转换器实际上可以与那个 selectManyCheckbox 一起工作,但是当我以 forClass 形式指定它时,它会被用于所有实例对象并导致在添加自定义转换器之前运行良好的其他代码现在给出“验证无效”错误?

4

1 回答 1

0

当所选项目上的方法针对任何可用项目返回value is not valid时,将引发验证错误。equals()true

事实上,你的equals()方法被打破了。以下行是错误的:

return (this.username==k.username);

我假设那username是一个String,这是一个Object。通过引用==比较Objects ,而不是按它们的。换句话说,当在两个s 上执行时,您基本上是在测试它们是否指向完全相同的实例。您没有检查它们是否代表相同的值(例如,实例的内部表示)。您应该改用's方法,该方法,这是从它的 javadoc 中摘录的相关内容:==ObjectObjectObjectequals()String#equals()

等于

public boolean equals(Object anObject)

将此字符串与指定对象进行比较。结果是true当且仅当参数不是null并且是String表示与该对象相同的字符序列的对象。

==仅在比较, boolean,int等原语long或测试null.

因此,要解决您的问题,请将错误的行替换为以下行:

return username.equals(k.username);

或者,当它们可能是null

return (username == null) ? (k.username == null) : username.equals(k.username);

也可以看看:

于 2012-06-30T22:13:15.853 回答