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 をオーバーライドしました (カスタム コンバーターが何とか何とか Validation is not valid エラーを与えるという話がたくさんあるため)。
@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 を使用してその 1 つのインスタンスでのみそのコンバーターを使用すると、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" を適切に使用できていないのか、コンバーターが実際にその 1 つの selectManyCheckbox で問題なく動作するのかですが、forClass フォームで指定すると、そのすべてのインスタンスに使用されます。カスタムコンバーターを追加する前にうまく機能していた他のコードが原因で、「検証が無効です」というエラーが発生するようになりましたか?