2

状況:JavaServer Facesページと、2つのプロパティを持つセッションスコープのマネージドBeanがありますArrayList<Integer>。1つは可能な値のリストを保持するためのもので、もう1つは選択された値のリストを保持するためのものです。JSFページには、<h:selectManyListBox>これら2つのプロパティがバインドされたコンポーネントがあります。

問題:フォームを送信した後、選択した値は文字列に変換されます(ArrayList型のプロパティは実際にはいくつかの文字列を保持しています!)。ただし、コンバーターを使用すると、次のようなエラーメッセージが表示されます。

検証エラー:値が無効です

質問ArrayList<Integer>:プロパティを<h:selectManyListBox>コンポーネントに適切にバインドするにはどうすればよいですか?

助けてくれてありがとう。

具体的なコード

JSFページ:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:body>
        <h:form>
            <h:selectManyListbox value="#{testBean.selection}">
                <f:selectItems value="#{testBean.list}"></f:selectItems>
            </h:selectManyListbox>
            <h:commandButton action="#{testBean.go}" value="go" />
            <ui:repeat value="#{testBean.selection}" var="i">
                #{i}: #{i.getClass()}
            </ui:repeat>
        </h:form>
    </h:body>
</html>

そしてマネージドBean:

import java.io.Serializable;
import java.util.ArrayList;

@javax.faces.bean.ManagedBean
@javax.enterprise.context.SessionScoped
public class TestBean implements Serializable
{
    private ArrayList<Integer> selection;
    private ArrayList<Integer> list;

    public ArrayList<Integer> getList()
    {
        if(list == null || list.isEmpty())
        {
            list = new ArrayList<Integer>();
            list.add(1);
            list.add(2);
            list.add(3);
        }
        return list;
    }

    public void setList(ArrayList<Integer> list)
    {
        this.list = list;
    }

    public ArrayList<Integer> getSelection()
    {
        return selection;
    }

    public void setSelection(ArrayList<Integer> selection)
    {
        this.selection = selection;
    }

    public String go()
    {
            // This throws an exception: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
            /*for (Integer i : selection)
            {
                System.out.println(i);
            }*/
        return null;
    }
}
4

1 に答える 1

8

のジェネリック型情報はList<Integer>実行時に失われるため、のみを表示するJSF / ELListは、ジェネリック型がデフォルトであることを識別できず、Integerデフォルトであると見なします(これは、リクエスト値の適用フェーズでの基になる呼び出しStringのデフォルトタイプであるため)。HttpServletRequest#getParameter()

を明示的に指定する必要がありConverterます。JSFビルトインを使用できますIntegerConverter

<h:selectManyListbox ... converter="javax.faces.Integer">

または、代わりに使用しInteger[]ます。そのタイプ情報は、実行時に明確に認識されます。

private Integer[] selection;
于 2012-12-13T18:32:45.273 に答える