【问题标题】:Validation Error: value is not valid when using a custom converter [duplicate]验证错误:使用自定义转换器时值无效[重复]
【发布时间】:2012-07-01 22:16:49
【问题描述】:

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 形式指定它时,它会被所有人使用该对象的实例并导致在添加自定义转换器之前运行良好的其他代码现在给出“验证无效”错误?

【问题讨论】:

    标签: validation jsf-2 converter


    【解决方案1】:

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

    确实,您的equals() 方法已损坏。以下行是错误的:

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

    我假设usernameString,即Object== 比较 Objects 的依据是reference,而不是它们的value。换句话说,当在两个Objects 上执行== 时,您基本上是在测试它们是否指向完全相同的实例。您没有检查它们是否代表相同的值(例如,Object 实例的内部表示)。您应该改用Objectequals() 方法,String#equals() 方法,这是其javadoc 的相关性摘录:

    等于

    public boolean equals(Object anObject)

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

    == 仅适用于比较 booleanintlong 等原语或测试 null 时。

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

    return username.equals(k.username);
    

    或者,他们可能是null

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

    另见:

    【讨论】:

    • 感谢您的回复,但它仍然无法正常工作。我将检查更改为等于(我忘记了这一点,因为我正在重用我在其他人询问验证错误的帮助答案中看到的 equals() 代码:值无效。
    • 我也尝试使用 NetBeans 生成 equals 和 hashCode....同样的错误。当我按名称指定转换器作为 h:selectManyCheckBox 的属性时,我完全不明白为什么即使没有覆盖等号和哈希码它也能 100% 工作。还有,忘记说了。就在我单击该复选框表单上的提交时,我在页面加载时没有收到错误。如果我命名转换器并且不使用 forClass...
    猜你喜欢
    • 2012-11-25
    • 2011-10-31
    • 2013-05-20
    • 2012-05-23
    • 1970-01-01
    • 2011-10-29
    • 2013-01-06
    • 2017-10-31
    • 1970-01-01
    相关资源
    最近更新 更多