[英]JSF2 InputText for Long value also takes string
我的JSF 2表單中有一個p:inputText字段,它映射到一個
HashMap<String, Long>
像這樣的值:
<p:inputText id="input1" value="#{simpleFormTest.longValues['input1']}" />
現在,當我在輸入文本中提交字符串值並遍歷我的Long對象映射時,我可以在其中看到該字符串值。 classCastException上沒有轉換異常。 當我再次提交表單時,我得到一個異常NumberFormatException。 轉換值時。 有趣的是,發生異常的轉換發生在從映射中讀取舊值時,而不是在嘗試設置新值時。 是否有人反對,如果這是JSF中的某個錯誤,還是如何避免它? 我發現,當我為該字段顯式設置LongConverter時,它正在工作,但是不應該隱式地進行此操作嗎? 謝謝。
這是一個簡單的測試:
SimpleFormTest.java
@Named("simpleFormTest")
@ConversationScoped
public class SimpleFormTest implements Serializable {
private Map<String, Long> longs = new HashMap<String, Long>();
public String submitAction() {
log.info("(Long): " + longs.get("test"));
}
public Map<String, Long> getLongs() {
return longs;
}
public void setLongs(Map<String, Long> longs) {
this.longs = longs;
}
}
layout.xhtml:
<h:form id="new-form">
<p:inputText value="#{simpleFormTest.longs['test']}" />
<p:commandButton action="#{simpleFormTest.submitAction}"
</h:form>
如果提交表單,則會收到以下日志消息:
[com.example.SimpleFormTest] (default task-15) (Long): aa
在運行時,java丟棄泛型類的所有類信息(因此,也將丟失映射的所有類信息)。 在內部,它僅與對象一起使用。 當您將<h:inputText>
映射到Bean的Long字段時,該信息在運行時仍然存在。 但是,當使用Map <...,Long>時,JSF不知道將String( <h:textInput>
的基本類型)映射到什么,因此它將它存儲為String。
正如@Gimby在評論中所建議的那樣,一種解決方案是構建一個簡單的轉換器並強制JSF將值存儲為Long。
@FacesConverter("longConverter")
public class FacesLongConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
return Long.parseLong(value);
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return ((Long) value).toString();
}
}
然后在您的JSF中使用轉換器
<h:inputText
converter="longConverter"
value="#{simpleFormTest.longs[input1]}"/>
我沒有進一步了解這個問題, 可能會有更簡單的解決方案 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.