繁体   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