验证错误:使用自定义转换器时值无效

时间:2012-06-30 21:20:30

标签: validation jsf-2 converter

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只选择一些用户并将它们放在一个单独的arraylist中以用于其他一些用途。我想推送整个对象(我总是可以轻松地使用字符串,并在我的控制器bean中创建和管理对象,但是想尝试自定义转换器以使selectItems与对象一起工作)

在我的班级中,我已经覆盖了equals和hashCode(因为有很多关于自定义转换器的讨论,因为blah blah验证不是有效错误)。

@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形式指定它时它会被用于所有该对象的实例并导致一些其他代码在添加自定义转换器之前工作正常,现在给出“验证无效”错误?

1 个答案:

答案 0 :(得分:0)

如果任何所选项目的value is not valid方法返回equals(),则会引发true验证错误可用的项目。

事实上,您的equals()方法已被破坏。以下行错误:

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

我假设usernameString,这是Object==通过参考比较Object,而不是通过进行比较。换句话说,当在两个==上执行Object时,您基本上会测试它们是否指向完全相同的实例。您没有检查它们是否代表相同的值(例如,Object实例的内部表示)。您应该使用Object的{​​{1}}方法,String#equals()方法,这里是javadoc的相关摘录:

  

等于

     

equals()

     

将此字符串与指定对象进行比较。当且仅当参数不是public boolean equals(Object anObject)并且是true对象时,结果为null,该对象表示与此对象相同的字符序列。

String仅适用于比较==booleanint等原语或测试long时的原语。

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

null

或者,当它们可能是return username.equals(k.username); 时:

null

另见: