如何在 XPages 中控制绑定到作用域变量的数值类型

How to control the numeric type of value bound to scoped variable in XPages

背景:

我有一个 XPage,其中有几个控件都绑定到 viewScope 变量。在按下按钮事件时,我 运行 调用一个 java 方法,该方法将 update/insert 使用 JDBC (无 Hibernate)进入 DB2。

在我的 java 方法中,我有一个变量解析器,它直接获取 viewScope 的句柄以访问数据。在viewScope Map中,所有的数据都存储为一个Object,然后你必须使用java.sql.PreparedStatementclass的方法进行转换。我使用它是因为参数被添加到准备好的语句而不是 SQL。 SQL 有添加依赖项的问号 (?)。 (这样做是为了安全 - 公司政策)。

这是一个简单的例子:

ps = c.prepareStatement(sql);
ps.setString(1, (String) viewScope.get("firstName"));

预处理语句对每种数据类型都有特定的方法。如果数据类型错误,则会出现异常。

问题:

在我的 XPage 上,我有两个数字编辑框。它们是相同的,都使用设置为货币的数字转换器。两者都仅设置为整数。当我尝试更新时,一个存储为 Long,一个存储为 Integer。 这是我确定的方式:

System.out.println("NSA object type=" + viewScope.get("manageNSA").getClass().getName());
System.out.println("PNSAC object type=" + viewScope.get("managePNSAC").getClass().getName());

日志文件结果

02/02/2015 05:45:42 PM  HTTP JVM: NSA object type=java.lang.Long
02/02/2015 05:45:42 PM  HTTP JVM: PNSAC object type=java.lang.Integer

哪里失败了:

ps.setInt(2, (Integer) viewScope.get("manageNSA"));

如果我有这段代码,它在第二个上也会失败。

ps.setLong(6, (Long) viewScope.get("managePNSAC"));

异常跟踪:

java.lang.ClassCastException: java.lang.Long incompatible with java.lang.Integer
java.lang.ClassCastException: java.lang.Integer incompatible with java.lang.Long

我的问题:

我如何在 XPages 中强制数字字段始终是 longs 的集合?或者我如何强制类型为我想要的任何类型,double、long、int 等???

我试过的:

将两者都转换为 Long 不起作用,这没有任何意义。我知道我可以在我的 java 中有一个 if 语句,它首先检查类型,然后调用适当的方法,但我宁愿强制 XPages 每次都设置相同的类型。

尝试转换为替身。我认为你需要先完成它。假设可行,然后从那里转换为 Long 或 int。我不确定...但我的直觉告诉你在处理 xpages 前端时需要经过双重处理。

==编辑

您可以尝试的另一件事是先设置 var...

var myVar:java.lang.Double = document1...随便

viewScope.put("myVar", myVar)

可能是这样的……

使用 String get(String)Long getLong(String) 方法制作助手 class,并在内部进行强制转换。

您的代码将是:

Helper data = new Helper("viewScope");
ps = c.prepareStatement(sql);
ps.setString(1, data.get("firstName"));
...
ps.setLong(6, data.getLong("managePNSAC"));

Constructor可以使用strig来识别binded map(可以是requestScope或者你自己实现了Map接口的bean)。

试试 Dojo 数字文本框。它允许您使用 javaType 定义它存储的数字类型。

您始终可以创建一个 Long 值并将其设置为范围变量

viewScope.managePNSAC = java.lang.Long.valueOf(yourValue);

使用通用转换器标签并指定要使用的转换器 ID:

<xp:this.converter>
    <xp:converter converterId="javax.faces.Integer" />
</xp:this.converter>

<xp:this.converter>
    <xp:converter converterId="javax.faces.Long" />
</xp:this.converter>

<xp:this.converter>
    <xp:converter converterId="javax.faces.Double" />
</xp:this.converter>

等...

DDE 不会做任何事情来帮助发现内置的东西以及 XPages 继承自的 JSF 环境。