如何在 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 环境。
背景:
我有一个 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 环境。