2

AIX用のWebsphereApplicationServerでSpring/Hibernateを使用しています。私のWindowsマシンでは、問題は発生しません。AIXで実行している場合のみです。ユーザーがアカウント番号を使用してログインするときに、ログインIDの前に「0」を付けると、アプリケーションはログインを拒否します。DB2テーブルでは、列は数値タイプであり、「090....」から「90...」への変換に問題はありません。

他の誰かがこのような問題を経験していますか?どちらのマシンにもJavav1.5が搭載されています。

具体的には、フローはFormView->LoginValidator->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()); 
    }
}

また、文字列からLongを構築し、WebSphereにパッケージ化されているJavaバイナリを使用するためのこの短い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
    }
}

解決

4

4 に答える 4

3

さて、そこでは非常に多くのことが起こっています。あなたは本当に問題を切り分けようとする必要があります-データベースに何が送られているのか、Javaによって何が見られているのかなどを調べてください。

問題を示すだけの短いが完全なプログラムにピン留めしてみてください。そうすれば、バグを報告したり、コードを修正したりするためのはるかに強力な立場になります。

于 2008-11-14T20:26:49.300 に答える
3

解決

同僚が Spring の更新について調査を行ったところ、v. 2.5.3 ではこのエラーが正しかったようです。

CustomNumberEditor は、先頭にゼロがある数値を 10 進数として扱います (16 進数を維持しながら、不要な 8 進数のサポートを削除しました)

Spring 2.0.5 を使用していました。単純に jar を Spring 2.5.4 に置き換えただけで、正常に機能しました。

助けてくれてありがとう。将来的に単体テストを利用する予定ですが、これは Spring のバグであることが判明しました。

于 2008-11-15T16:09:47.790 に答える
2

文字列のパスをたどってデータベースまでプログラムをトレースし、そのパス上のすべてのメソッドの単体テストを実行します。そして、ここで可能な限り最短のルートを取るのではなく、異なる入力と期待される出力を使用して複数の単体テストを行い、何がうまくいかなかったかを実際に確認します。エラーが見つからないと仮定して、他のコンピューターで同じ単体テストを実行すると、バグを特定できるはずです。頭のてっぺんから、大文字と小文字の区別に関係があると思いますが、確かな方法はありません。

次回は、TDDを使用します。

于 2008-11-14T20:33:52.377 に答える
0

私はJavaについてあまり知りませんが、先頭の「0」のために文字列が8進文字列として解釈される可能性があります。

おそらくこれは、Long.parseLong(a, 10) を使用して回避できます。

于 2008-11-14T22:03:57.890 に答える