Validation 验证错误:使用自定义转换器时,值无效
NetBeans 7.1.1 JSF2.1 在h:selectManyCheckBox中使用converter=“convK”属性时,一切正常。但我试着使用@facescoverter(forClass=className.class)表单,它总是给我“Validation is not Valid”错误。我已尝试将其更改为forClass=packageName.className.class,但没有帮助 这是一个转换器: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
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} #{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);