Java не преобразует строку в длинный объект правильно

StackOverflow https://stackoverflow.com/questions/291286

Вопрос

Мы используем Spring/Hibernate на сервере приложений Websphere для AIX.На моей машине с Windows проблема не возникает — только при запуске AIX.Когда пользователь входит в систему с номером учетной записи, если он добавляет префикс «0» к своему идентификатору входа, приложение отклоняет вход в систему.В таблице DB2 столбец имеет числовой тип, и проблем с преобразованием '090....' в '90...' возникнуть не должно.

Кто-нибудь еще испытывает подобную проблему?Обе машины имеют Java v1.5.

Если быть более конкретным, поток FormView -> LoginValidator -> LoginController.

В LoginValidator значение входа равно нулю с префиксом 0.Без 0 значение будет таким, каким оно должно быть (но опять же, это только в среде AIX - в средах 2 Windows все в порядке).Вот фрагмент кода, где объект равен нулю.

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 из строки и использования двоичного файла Java, поставляемого с WebSphere.

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 и, по-видимому, эта ошибка была исправлена ​​в версии v.2.5.3:

CustomNumberEditor обрабатывает числа с ведущими нулями как десятичные (удалена нежелательная поддержка восьмеричных чисел при сохранении шестнадцатеричного числа)

Мы использовали Spring 2.0.5.Мы просто заменили jars на Spring 2.5.4, и всё заработало как надо!

Спасибо всем за помощь/помощь.В будущем мы будем использовать модульные тесты, но оказалось, что это ошибка Spring.

Другие советы

Ну, там очень много всего происходит. Вам действительно нужно попытаться изолировать проблему - выяснить, что отправляется в базу данных, что видит Java и т. Д.

Попробуйте закрепить его в короткой, но полной программе, которая просто показывает проблему - тогда вы окажетесь в гораздо более сильной позиции, чтобы сообщить об ошибке или исправить свой код.

Проследите через программу по пути String до базы данных и выполните модульные тесты для каждого метода на этом пути. И не просто выбирайте кратчайший возможный маршрут, проведите несколько модульных тестов с разными входами и ожидаемыми выходами, чтобы действительно увидеть, что пошло не так. Предполагая, что вы не найдете никаких ошибок, запустите те же модульные тесты на другом компьютере, и вы сможете точно определить ошибку. Наверху я бы предположил, что это может быть связано с чувствительностью к регистру, но на самом деле нет никакого способа быть уверенным.

В следующий раз используйте TDD.

Я не очень разбираюсь в Java, но может случиться так, что строка интерпретируется как восьмеричная строка из-за ведущего " 0 ".

Вероятно, вы можете обойти это, используя Long.parseLong (a, 10).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top