簡體   English   中英

JSF2 InputText for Long值也需要字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM