当前位置: 首页 > 知识库问答 >
问题:

为什么JSF要把字符串值放在映射中?又该如何解决这个问题呢?

严修德
2023-03-14

一开始我得到了一些ClassCastExceptions。当我找到源代码时,我发现我的map 中的值实际上是字符串

我做了以下实验来检查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>

我的TestBean:

@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

那么我的问题是:我怎样才能轻松地围绕它工作呢?

我对JSF很陌生,在寻找解决方案时我听说过转换器。是否必须创建自定义转换器来强制对输入字段的Integer.ValueOf(String)进行调用?我在哪能找到怎么做?有没有更简单的解决办法?

共有1个答案

蒋波光
2023-03-14

您的具体问题是由于Java泛型类型信息只在编译时出现,因此在运行时完全不存在,并且EL表达式只在运行时计算,因此不在编译时。实际上,EL看不到任何泛型类型信息。

EL在运行时看到的所有内容基本上都是map,而不是map 。因此,除非显式指定转换器,JSF/EL将假定它与作为HTTP请求参数提取的提交值是相同的标准类型:字符串

解决方案比较简单:显式指定一个转换器。对于integer类,您可以使用JSF内置的integerConverter,它具有转换器IDjavax.faces.integer

<p:spinner value="#{testBean.mapInt[0]}" converter="javax.faces.Integer" />
 类似资料:
  • 编写一个程序,定义一个类TestIsSubString和一个方法isSubString,该方法在另一个字符串中搜索特定的字符串;如果前者存在于后面的字符串中,则该方法必须返回true。例如:-isSubString(“cat”,“the cat in the hat.”)为true,但isSubString(“bat”,“the cat in the hat.”)为false。还要验证满足以下边界

  • 启动错误 ApplicationContext.若要显示条件报告,请在启用“调试”的情况下重新运行应用程序。2019-10-17 15:44:43.968错误10460--[main]O.S.Boot.SpringApplication:应用程序运行失败 我的pom.xml:

  • 我正试图在Android Studio上调试我的项目——一个非常简单的东西——hello world。我得到这个信息: "安装未成功。应用程序无法安装:INSTALL_FAILED_MISSING_SHARED_LIBRARY apk列表:[0]'C:\Users\Pierr\AndroidStudioProjects\Hello\app\build\outputs\apk\debug\app d

  • 这是一个骇人听闻的问题:爱丽丝是一个幼儿园老师。她想给班上的孩子们一些糖果。所有的孩子坐成一行(他们的位置是固定的),每个人根据他(她)在班上的表现有一个评级分数。爱丽丝想给每个孩子至少一颗糖。如果两个孩子挨着坐,那么评分较高的那一个必须得到更多的糖果。爱丽丝想省钱,所以她需要尽量减少给孩子们的糖果总数。 测试数组:n=10,n个元素为[2 4 2 6 1 7 8 9 2 1]。我得到的答案是18

  • 正在启动Gradle守护进程...Gradle守护进程5 s 654 ms启动 失败:生成失败,出现异常。 > 其中:构建文件'c:\users\asus\androidstudioprojects\culturelwordsgame\app\Build.gradle'行:1 错误:评估项目':app'时出现问题。 未能应用插件[id'com.android.internal.version-ch