最初に 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
問題が発生しない理由です。integer
Integer
私はこれで正しいですか?
私の質問は次のとおりです。どうすれば簡単に回避できますか?
私はJSFにかなり慣れていません。解決策を探しているときにコンバーターについて聞いたことがあります。Integer.valueOf(String)
入力フィールドでの呼び出しを強制するには、カスタム コンバーターを作成する必要がありますか? その方法はどこにありますか?もっと簡単な解決策はありますか?