1

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}&#160;#{it.prezime}" itemValue="#{it}"/>
      </h:selectManyCheckbox>

私が知らないのは、コンバーター注釈で forClass="whatever" を適切に使用できていないのか、コンバーターが実際にその 1 つの selectManyCheckbox で問題なく動作するのかですが、forClass フォームで指定すると、そのすべてのインスタンスに使用されます。カスタムコンバーターを追加する前にうまく機能していた他のコードが原因で、「検証が無効です」というエラーが発生するようになりましたか?

4

1 に答える 1

0

選択したアイテムのメソッドが使用可能なアイテムのいずれにも返されなかっvalue is not validた場合、検証エラーがスローされます。equals()true

そして確かに、あなたのequals()方法は壊れています。次の行は間違っています。

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

私はそれusernameが であるStringと仮定しますObject。は、ではなく、参照によって s を==比較します。つまり、2 つの に対して実行する場合、基本的に、それらがまったく同じインスタンスを指しているかどうかをテストしています。それらが同じ値 (たとえば、インスタンスの内部表現)を表しているかどうかを確認していません。メソッドの代わりにメソッドを使用する必要があります。これは、javadoc からの関連性の抜粋です。Object==ObjectObjectObjectequals()String#equals()

等しい

public boolean equals(Object anObject)

この文字列を指定されたオブジェクトと比較します。結果は、引数がこのオブジェクトと同じ文字シーケンスを表すオブジェクトではなく、そのオブジェクトであるtrue場合にのみ得られます。nullString

は、、 、 などの==プリミティブを比較する場合、または をテストする場合にのみ適用されます。booleanintlongnull

したがって、問題を解決するには、間違った行を次の行に置き換えます。

return username.equals(k.username);

または、次の可能性がある場合null:

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

以下も参照してください。

于 2012-06-30T22:13:15.853 に答える