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