2

selectManyCheckboxタグに問題があります。

JBossPortal内でJSF1.1を使用しています(バージョン4.2だと思いますが、確かではありません)。

次のJSFマークアップがあります。

<h:selectManyCheckbox layout="lineDirection" 
   value="#{personBean.selectedPersonsLongArray}"
   id="selectedPersons">
   <f:selectItems value="#{personBean.persons}" />
</h:selectManyCheckbox>

(もちろん、フォームを送信するボタンがあります)。私の豆は次のようになります。

    public class PersonBean {
        private List<SelectItem> persons;

        private List<SelectItem> selectedPersons = new ArrayList<SelectItem>(); // +getter +setter
        private List<String> selectedPersonsStringList = new ArrayList<String>();// +getter +setter
        private List<Long> selectedPersonsStringList = new ArrayList<Long>();// +getter +setter
        private long[] selectedPersonsLongArray = new long[0];// +getter +setter
        private String[] selectedPersonsStringArray = new String[0]; // +getter +setter

        public void getPersons(){
            if(persons == null){
                List<Person> personsFromDb = // get from DB
                persons = new ArrayList<Person>(personsFromDb.size());
                for(Person person : personsFromDb){
                    // ID of a person is a long
                    persons.add(new SelectItem(person.getId(), person.getName()));
                }
            }
            return persons;
        }

        public void setPersons(List<SelectItem> persons){
            this.persons = persons;
        }

        ...
    }

Beanはセッションスコープであり、PersonのIdプロパティはタイプlongです。タグの値をBeanにリストされているすべてのタイプにバインドしようとしました。selectedPersonLongArray送信時に、「検証エラー」メッセージを除くすべてが表示されます。バインドすると、入力する必要がselectedPersonLongArrayあるというエラーが表示されます。selectedPersons

私が言ったように、Beanはセッションスコープであり、personsリストがリクエスト間で変更されないことを再確認しました。これは、このタグの一般的な問題のようです。

何か案は?

4

1 に答える 1

3

ジェネリック型情報は実行時に失われます。すべての JSF/EL (実際にはリフレクション) は、Listではなく を認識しList<Long>ます。デフォルトの型はString、 の標準的な戻り値の型であるためrequest.getParameter()です。これは、使用可能なアイテムのリスト内の値のいずれかをチェックしても返されませんtrue。これは、「検証エラー: 値が無効です」というエラーを説明しています。equals()Long

JSF/EL がリフレクションによって正しい型を判断できるようにするには、long[]orなどの固定型プロパティが必要です。Long[]

設計上の制限により本当に必要な場合はList<Long>、コンバーターを明示的に指定する必要があります。そうしないと、JSF は変換されていないStringオブジェクトでそれを埋めるだけであり、最終的ClassCastExceptionにはビジネス コードがそれを反復し始めたときにのみ発生します。

これには、JSF 組み込みjavax.faces.Longコンバーターを使用できます。

<h:selectManyCheckbox ... converter="javax.faces.Long">

更新:コメントに基づいて、動作long[]中に変換エラーが発生した可能性が最も高いLong[]です。これはおそらく JSF 1.1 固有のバグです。それから固執してLong[]ください。

于 2012-10-30T11:34:33.047 に答える