我们在Websphere Application Server for AIX上使用Spring / Hibernate。在我的Windows机器上,只有在运行AIX时才会出现问题。当用户使用帐号登录时,如果他们在其登录ID前面加上“0”,则应用程序拒绝登录。在DB2表中,该列是数字类型,将'090 ....'转换为'90 ...'时应该没有问题

其他人遇到过这样的问题?两台机器都有Java v1.5。

更具体地说,流程是FormView - <!> gt; LoginValidator - <!> gt;的LoginController

在LoginValidator中,login的值为null,前缀为0.如果没有0,则该值应该是该值(但是,这只是在AIX环境中 - 在2个Windows环境中它没关系)。这是代码片段,其中对象等于null ..

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程序,用于从String构造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
    }
}

解决方案

有帮助吗?

解决方案 2

一位同事对Spring更新进行了一些研究,显然这个错误在第2.5.3节中是正确的:

  

CustomNumberEditor将前导零的数字视为十进制(删除不需要的八进制支持,同时保留十六进制)

我们使用的是Spring 2.0.5。我们简单地用Spring 2.5.4取代了罐子,它应该有效!

感谢大家的帮助/帮助。我们将来会使用单元测试,但这只是一个Spring bug。

其他提示

那里有很多事情要发生。你真的需要尝试隔离问题 - 找出发送到数据库的内容,Java等所看到的内容。

尝试在一个简短但完整的程序中将其固定下来,只是显示问题 - 然后您将处于更强大的位置来提交错误或修复您的代码。

跟踪程序跟踪String的路径一直到数据库并对该路径上的每个方法进行单元测试。并且不要只采用最短路径,使用不同的输入和预期输出进行多个单元测试,以真正看出可能出现的问题。假设您没有发现任何错误,请在另一台计算机上运行相同的单元测试,您应该能够查明错误。从我的头脑中,我认为它可能与区分大小写有关,但实际上没有办法确定。

下次使用TDD。

我对Java知之甚少,但由于前导<!>“0 <!>”,字符串被解释为八进制字符串。

你可以使用Long.parseLong(a,10)解决这个问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top