2008-11-14 5 views
1

AIX 용 Websphere Application Server에서 Spring/Hibernate를 사용하고 있습니다. 내 Windows 컴퓨터에서는 AIX에서 실행될 때만 문제가 발생하지 않습니다. 사용자가 계정 번호로 로그인하면 로그인 ID 앞에 '0'이 붙으면 응용 프로그램이 로그인을 거부합니다. DB2 테이블에서 열은 숫자 유형이며 '090 ....'을 '90 ... '로 변환하는 데 문제가 없어야합니다.Java가 문자열을 Long Object로 올바르게 변환하지 않습니다.

다른 누구나 이와 같은 문제가 발생합니까? 두 시스템 모두 Java v1.5입니다.

더 구체적으로, 흐름은 FormView -> LoginValidator -> 인 LoginController

LoginValidator에서 로그인의 값이 0이 없으면 0 접두어와 null의 경우, 값은 그것이 있어야 무엇인가 (그러나 다시 말하지만, 이것은 AIX 환경에서만 가능합니다. 2 개의 Windows 환경에서는 괜찮습니다. 여기에 나는 또한 문자열에서 롱을 구성하고,

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 
    } 
} 
는 WebSphere

와 함께 패키지되어있는 자바 바이너리를 사용하는이 짧은 Java 프로그램을 작성한 객체가 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()); 
    } 
} 

입니다

SOLUTION

+0

Long으로 변환하는 코드가 초기 0을보고 그것이 8 진이라고 생각할 수 있습니까? –

+0

가능하지만 플랫폼에 따라 다릅니 까? 그 문제는 Windows 컴퓨터에서도 발생하지 않습니까? –

+0

확실히 그게 문제가 아니어야합니다. 그러나 실패한 코드를 분리하여 자체적으로 재현 해보십시오. 짧은 콘솔 앱이이 기능을 잘 수행합니다 (물론 단위 테스트입니다). –

답변

2

솔루션

공동 작업자는 봄 업데이트에 대한 몇 가지 조사를했는데, 분명히이 오류가 V에서 정확했다. 2.5.3 :

CustomNumberEditor 진수로 0이 붙는 숫자 (16 진수를 유지하면서 제거 원치 않는 진수 지원)

우리는 봄 2.0.5를 사용하고 처리합니다. 우리는 단순히 스프링 2.5.4로 항아리를 교체했고, 그것이 있어야만했던 것처럼 작동했습니다!

도움/도움을 제공해 주신 모든 분들께 감사드립니다. 우리는 앞으로 Unit 테스트를 사용할 것이지만 이것은 봄 버그로 판명되었습니다.

3

음, 거기에는 많은 일들이 있습니다. 당신은 정말로 문제를 격리하려고 노력해야합니다 - 데이터베이스에 보내지는 것들, Java 등에서 보이는 것들을 해결하십시오.

에 문제가있는 짧지 만 완전한 프로그램에서 문제를 해결하려고 시도하십시오. 버그를 제기하거나 코드를 수정하는 데 훨씬 더 유리한 입장에 서게 될 것입니다.

+0

Validator로 가기 전에 Spring이 Command 객체를 생성 할 때 뭔가해야한다. 세터 내부에서 SystemOut을 수행하고 거기에서 무슨 일이 일어나는지 살펴볼 것입니다. 감사합니다. –

+0

System.out을 사용하는 대신 디버거를 사용하는 것이 좋습니다. AIX 상자에서 사용할 수 없더라도 devbox에서 변환 작업을 볼 수 있어야합니다. 그러면 결함있는 코드를 분리 할 수 ​​있습니다. –

2

문자열 경로를 따라 데이터베이스까지 추적하고 해당 경로의 모든 단일 메서드에 대해 단위 테스트를 수행합니다. 그리고 가능한 한 가장 짧은 경로를 택하지 말고 다른 입력과 예상 출력을 가진 여러 개의 단위 테스트를 만들어 실제로 잘못되었을 가능성을 실제로 확인하십시오. 오류를 발견하지 못했다고 가정하면 다른 컴퓨터에서 동일한 단위 테스트를 실행하면 버그를 정확히 찾아 낼 수 있습니다. 내 머리 꼭대기에서 나는 그것이 대소 문자를 구분하는 것과 관련이 있다고 가정 하겠지만 실제로 확신 할 수있는 방법은 없습니다.

다음 번에는 TDD를 사용하십시오.

0

자바에 대해 많이 알지 못하지만,이 문자열은 선행 "0"때문에 8 진수 문자열로 해석됩니다.

아마도 Long.parseLong (a, 10)을 사용하여이 문제를 해결할 수 있습니다.

+0

문자열 값은 8 진수 해석을 거쳐서는 안됩니다. 그러나 Java는 그렇게하지 않습니다. new Long (a)는 JDK 코드를 보면 Long.parseLong (a, 10)을 호출합니다. –

+0

JDK 코드는 보지 않았지만 표준을 보았습니다. 방금 IBM이 버그가 포함 된 다른 구현을 가지고 있다고 생각했습니다. Long.parseLong (a, 10)을 명시 적으로 호출하면이 가설을 테스트합니다. –

-1

다른 시스템에서 다르게 작동하는 이유를 잘 모르겠습니다. 많은 C- 유래 언어에서 0으로 시작하는 숫자는 10 진수가 아닌 8 진수로 취급됩니다. 다시 말하지만, 모든 플랫폼에서 동일하게 작동해야하지만 Hans가 parseLong 메소드에서 기수를 10으로 지정하는 방법을 시도해 볼 수 있습니다.

+0

새로운 Long (String)은 코드를 보면 Long.parseLong (String, 10)을 호출하므로 아무런 차이가 없어야합니다. –