【发布时间】:2010-09-22 10:06:06
【问题描述】:
我们在 AIX 的 Websphere Application Server 上使用 Spring/Hibernate。在我的 Windows 机器上,该问题不会发生——仅在运行 AIX 时才会发生。当用户使用帐号登录时,如果他们在登录 ID 前加上“0”前缀,则应用程序会拒绝登录。在 DB2 表中,该列是数字类型,将 '090....' 转换为 '90...' 应该没有问题
还有其他人遇到过这样的问题吗?两台机器都有 Java v1.5。
更具体地说,流程是FormView -> LoginValidator -> LoginController
在 LoginValidator 中,login 的值为 null,带有前缀 0。没有 0,该值就是它应该是的值(但同样,这仅在 AIX 环境中——在 2 个 Windows 环境中它很好)。这是对象等于 null 的代码的 sn-p..
public class LoginValidator implements Validator {
public boolean supports(Class clazz) {
return Login.class.equals(clazz);
}
@SuppressWarnings("all")
public void validate(Object obj, Errors errors) {
System.out.println("Inside LoginValidator");
Login login = (Login) obj;
//null value
System.out.println("Before conversion in Validator, store id = "
+ login.getStoreId());
}
}
我还编写了这个简短的 Java 程序,用于从字符串构造 Long,并使用 WebSphere 打包的 java 二进制文件
public class String2Long {
public static void main(String[] args){
String a = "09012179";
String b = "9012179";
Long _a = new Long(a);
Long _b = new Long(b);
System.out.println(a + " => " + _a); //09012179 => 9012179
System.out.println(b + " => " + _b); //9012179 => 9012179
System.out.println("_a.equals(_b) " + _a.equals(_b)); //_a.equals(_b) true
}
}
【问题讨论】:
-
会不会是转换成 Long 的代码看到初始的 0 就认为是八进制?
-
有可能,但是否依赖于平台? Windows机器上不会也出现这个问题吗?
-
这当然不应该是问题。但是尝试隔离失败的代码,然后自行重现它 - 一个简短的控制台应用程序对此很有用(或者当然是单元测试)。
-
哦,显示实际执行从 String 到 Long 转换的代码会很方便。
-
好吧,您可以通过使用 Long.parseLong() 手动转换为 long 来测试它并查看它返回的内容...或手动执行 Long.parseLong(login, 10) 来制作确定它是十进制的。 (其中 login 是您要转换的变量)
标签: java hibernate spring websphere aix