2

最初に ClassCastExceptions をいくつか取得しました。ソースに行ったとき、私の値Map<Integer,Integer>が実際には文字列であることがわかりました。

PrimeFaces の使用が問題であるかどうかを確認するために、次の実験を行いました。

<h:form>
    <p:spinner value="#{testBean.integer}" />
    <h:inputText value="#{testBean.integer}" />
    <p:spinner value="#{testBean.mapInt[0]}" />
    <h:inputText pt:type="number" value="#{testBean.mapInt[1]}" />
    <p:commandButton value="Read Map Values" action="#{testBean.checkTypes}" update="@form" />
    <p:messages />
</h:form>

私のテストビーン:

@ManagedBean
@ViewScoped
public class TestBean implements Serializable {

    private HashMap<Integer, Integer> map;
    private Integer integer;

    @PostConstruct
    public void init() {
        map = new HashMap<>();
    }

    public void checkTypes() {
        addMsg(null, "integer - Class: " + integer.getClass().getSimpleName());
        for (Object key : map.keySet()) {
            Object o = map.get(key);
            addMsg(null, "map[" + key.toString() + "] - Class: " + o.getClass().getSimpleName());
        }
    }

    private static void addMsg(String client, String msg) {
        FacesContext.getCurrentInstance().addMessage(client, new FacesMessage(msg));
        System.out.println("msg [" + client + "]: " + msg);
    }

    //... getters/setters ...
}

メッセージは次のように表示されます。

integer - Class: Integer
map[0] - Class: String
map[1] - Class: String

最初のもの<h:inputText>は、数値入力を強制するためのパススルーさえ必要としませんでした。

JSFは内部でリフレクションを使用して、フィールドの入力文字列を正しい型に変換していると思います。もしそうなら、おそらくジェネリックの型消去により、あるべきString場所に a を置くことができます。これがおそらく、ジェネリック型ではなく型である でInteger問題が発生しない理由です。integerInteger

私はこれで正しいですか?

私の質問は次のとおりです。どうすれば簡単に回避できますか?

私はJSFにかなり慣れていません。解決策を探しているときにコンバーターについて聞いたことがあります。Integer.valueOf(String)入力フィールドでの呼び出しを強制するには、カスタム コンバーターを作成する必要がありますか? その方法はどこにありますか?もっと簡単な解決策はありますか?

4

1 に答える 1