| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > #springBind выкидывает ошибку. |
| Автор: ShurikA 16.11.2009, 13:05 | ||||||||
Есть контроллер:
и фаблон формы:
Форма отрисовывается и отрабатывает нормально всегда, кроме одного случая: Когда, я бытаюсь создать новую запись (EmployeePosition) при этом такова уже сыществует. Я должем вернуться в форму с ошибкой. За это овечает вот этот код:
но в место этого получаю ексепшен:
что я делаю не так. P.S. Кстати, у меня есть ещё два контроллера, в которых сделанно таким же образом (для других объектов), и всё работает как часы... |
| Автор: ShurikA 16.11.2009, 13:25 | ||
А вот то что я получяю на Tomcat-e:
|
| Автор: Juggernaut 16.11.2009, 13:27 | ||
Судя по тексту ошибки и вот этому коду
у вас отличаются входной параметр set метода и выходной параметр get метода для свойтва emplPosId Что-то типа: Object getEmplPosId() void setEmplPosId(Integer id) Надо привести к одному типу, ИМХО. |
| Автор: ShurikA 16.11.2009, 13:30 | ||
| Juggernaut, Да вроде нет:
|
| Автор: Juggernaut 16.11.2009, 13:48 | ||
Тогда второе предположение:
где судя по докам br.getModel() возращает Map получается, что в форме под именем "emplPosFormCommand" лежит обычная Map, у которой естественно нет никаких методов: а вот и логи .... Invalid property 'emplPosId' of bean class [java.util.HashMap]: |
| Автор: Juggernaut 17.11.2009, 12:46 | ||
Но если все прекрасно работает можно попробовать вынести проверку дублирующихся записей на этап валидации.
Собственно try-catch убрать, логику вывода сообщения перенести в новый метод. ИМХО, использование исключений для обработки логики not the pattern way. ))) P.S. Если не сильно сложно я бы хотел глянуть хотя бы один из работающих контроллеров и валидатор. |
| Автор: ShurikA 17.11.2009, 20:45 | ||
Но в таком случае мне нужно делать инджекшен DAO класса в валидатор. Я не очень чотел этого делать. |
| Автор: Juggernaut 18.11.2009, 10:05 |
А чем плоха Injection в валидатор? Я в своем проекте делал форму регистрации на Spring, где нужно было как раз проверять на наличие дублирующихся e-mail, nickname и т. д. Собственно все это дело проверялось методами checkDuplicateXXX в валидаторе посредством заинжектенного сервиса/DAO. Тогда даже не знаю.... Выведите в логи содержимое br.getModel в том месте где работает и где нет, посмотрите чего не хватает и ручками добавьте. Хотя это уже debug и проблему не решает. |
| Автор: ShurikA 18.11.2009, 10:13 |
| Juggernaut, Буду пробовать с DAO в валидаторе. И расскажу как было |
| Автор: ShurikA 18.11.2009, 11:57 | ||||||
|
| Автор: Juggernaut 18.11.2009, 12:13 | ||||
| Вот оно: Так правильно:
а так нет,
потому что из исходников спринга в комментах для метода getModel Return a model Map for the obtained state, exposing an Errors instance as MODEL_KEY_PREFIX + objectName' and the object itself. Т.е. HashMap модель ошибок уже содержит в себе командный объект и связанные с ним ошибки. |
| Автор: ShurikA 18.11.2009, 12:34 | ||||||
Так оно так и было, изначально... Это потом я уже начал с этим играться и пытаться понять почему не работает. Но это уже не важно, так как я уже начал переделывать валидатор с инджектом сервиса. но как обычно, всё не как у людей пока что @Autowire в валидаторе не пашет. Добавлено через 7 минут и 49 секунд
Это то что ты имел в виду? Добавлено через 9 минут и 46 секунд При валидации вылетает такое:
|
| Автор: Juggernaut 18.11.2009, 13:12 |
| Не очень понятная ошибка - номера строчек мне ни о чем не говорят. Но похоже у тебя NPE из-за отсутствия сервиса. Сделай такой "финт ушами": EmployeeTypeFormValidator etFormValidator = new EmployeeTypeFormValidator(); etFormValidator.setService(/*..тут твой сервис из контроллера */); etFormValidator.validate(etComm, br); т.е. устанавливаешь сервис не через Autowired, а из контроллера. Интересно почему сервис сам не подключился... Добавлено через 13 минут и 26 секунд Можно попробовать еще заменить @Autowired на @Resource |
| Автор: ShurikA 18.11.2009, 20:12 | ||
ну это должно сработать, но это уже не injection попробую... |
| Автор: Juggernaut 19.11.2009, 10:41 |
| Я могу предположить, что у тебя @Autowired не работает, т.к. ты класс валидатора как spring-bean не зарегестрировал. Если ты используешь только аннотации, тогда надо валидатор аннотировать как @Component и и сам валидатор должен лежать в package, который прописан у тебя в component-scan. Если ты используешь xml-декларации, то надо объявить как <bean id="empfValidator" ..../> Плюс если уже использовать DI до конца, то можно и валидатор заинжектить в контроллер, не объявлять его через new. |
| Автор: ShurikA 19.11.2009, 11:44 | ||||||||
Не помогает.
Добавлено через 2 минуты и 11 секунд
Тоже ноль на массу... |
| Автор: ShurikA 21.11.2009, 14:02 | ||||||
| Так, на помощь!!!!! Ну никак не хочет он рапотать... Добился того что бы нормаль работали инджекшены так что мой контроллер сечас выглядит так:
при этом, если вот тут:
валидация не проходит, то вместо того что бы спокойно показать опять ту же форму с ошибкой, получаю следующее:
и самое интересное, что у меня есть 3 достаточно похожих контроллеров. и все прекрасно работают кроме этого. Где я туплю? |