Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation 验证错误:使用自定义转换器时,值无效_Validation_Jsf 2_Converter - Fatal编程技术网

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

Validation 验证错误:使用自定义转换器时,值无效,validation,jsf-2,converter,Validation,Jsf 2,Converter,NetBeans 7.1.1 JSF2.1 在h:selectManyCheckBox中使用converter=“convK”属性时,一切正常。但我试着使用@facescoverter(forClass=className.class)表单,它总是给我“Validation is not Valid”错误。我已尝试将其更改为forClass=packageName.className.class,但没有帮助 这是一个转换器: import javax.faces.component.UIComp

NetBeans 7.1.1 JSF2.1

在h:selectManyCheckBox中使用converter=“convK”属性时,一切正常。但我试着使用@facescoverter(forClass=className.class)表单,它总是给我“Validation is not Valid”错误。我已尝试将其更改为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 "";
}   
}
编辑。当我将它作为命名转换器使用,并且仅在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形式指定它时,它会用于该对象的所有实例,并导致在添加自定义转换器之前运行良好的一些其他代码现在给出“验证无效”错误?

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

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

return (this.username==k.username);
我假设
用户名
是a,它是a。
=
通过引用而不是通过它们的来比较
对象
。换句话说,当对两个
对象
执行
=
时,您基本上是在测试它们是否指向完全相同的实例。您不是在检查它们表示相同的值(例如,
对象
实例的内部表示)。您应该使用
对象
equals()
方法来代替该方法,这里是从其javadoc中提取的相关性:

等于
public boolean equals(Object-anObject)

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

=
仅在比较诸如
boolean
int
long
等基本体时适用,或者在测试
null
时适用

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

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

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

感谢您的回复,但它仍然无法正常工作。我将check改为equals(我忘记了这一点,因为我正在重用equals()我在帮助回答中看到的代码是关于其他人询问验证错误的:值无效。我还尝试使用NetBeans生成等于和哈希代码…同样的错误。我完全不明白,当我将converter by name指定为h:selectManyCheckBox的属性时,为什么它在不重写等于和哈希代码的情况下也能100%工作。另外,忘了使用m注意。当我在复选框窗体上单击“提交”时,页面加载不会出现错误。如果我命名转换器并且不使用forClass,则不会出现错误。。。
return (username == null) ? (k.username == null) : username.equals(k.username);