Java не преобразует строку в длинный объект правильно
Вопрос
Мы используем 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).