| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > @Autowired SessionFactory null |
| Автор: 4epT 13.7.2011, 09:20 | ||||||
| Доброе утро, собственно проблема в том, что после конфигурации SessionFactory через Spring он не инициализируется. Вот его конфигурация:
Файл hibernate.cfg.xml:
Так же в файле конфигурации указываю какие пакеты сканировать:
В DAO классе создается приватная переменная sessionFactory (get и set методы я для нее не делал) .... и в момент вызова какого либо метода класса sessionFactory null. Кто может подсказать что я не правильно делаю ? |
| Автор: Farmazon 13.7.2011, 10:29 |
| На самом DAO какие нибудь ещё аннотации висят?... безопасность, транзакции... Посмотри типы бинов в рантайме sessionFactory и dao-бинов... |
| Автор: 4epT 13.7.2011, 10:41 | ||||
На самом DAO классе висит еще аннотация @Repository, в транзакции методы пока что не оборачивал.
а вот насчет этого можно поподробнее ? Как посмотреть и зачем ? |
| Автор: Farmazon 13.7.2011, 11:28 |
| Да сделай так, чтобы тот же DAO реализовывал интерфейс ApplicationContextAware. Он добавит метод, где присваивается applicationContext, сохрани его в какое-нибудь поле класса. Затем в методе, который можешь вызвать, брось брекпоинт. А в отладке на брекпоинте через watch можно повызывать метод getBean с разными параметрами у контекста. Он будет возвращать бины. Так можно проверить, существуют ли бины в контексте, в каком количестве и какой у них класс... Короче можно посмотреть что творится с контекстом в рантайме. |
| Автор: 4epT 13.7.2011, 11:31 | ||
Хорошо, попробую .. и отпишусь о результате ) Спасибо! P.s. я надеюсь это ведь делается только для отладки ?) |
| Автор: Farmazon 13.7.2011, 11:33 |
| applicationContext бывает удобно получать бинам-синглтонам, чтоб они могли выдёргивать из контекста прототипы и сессионные бины... |
| Автор: 4epT 13.7.2011, 11:40 |
| А чем удобнее выдергивать бины из контекста, чем сразу описать нужные бины полями в классе ? |
| Автор: MisterCleric 13.7.2011, 12:40 | ||
Получишь такой баг как "Scope Impedance". Выйдет ситуация такая: твой бин в scope="singleton" "проаутоварится" бинами в более низком scope только один раз - при инициализации. И зашарит эти поля для всех конечных пользователей. |
| Автор: 4epT 13.7.2011, 12:56 |
| Не очень понятно насчет бага ... в конечном счете он все равно про инициализирует эти поля и с этими полями можно будет нормально работать. Например я ведь могу сделать singleton класс, в котором будут "аутоварится" все бины (к примеру Dao классы). все бины сделать static, и через этот класс всегда доставать нужный мне бин ... как тут проявится этот баг ? |
| Автор: MisterCleric 13.7.2011, 13:42 |
| 4epT, Ты привел пример, когда все бины у тебя сервисы. А вот что ты будешь делать, если у тебя этот синглетонный сервис на этапе вызова должен обслужить сессионные данные конкретного пользователя? Сначала http://www.google.com.ua/search?q=Spring+scope+impedance, а потом ругайся |
| Автор: 4epT 13.7.2011, 13:53 | ||
Ты меня не правильно понял. Я даже не пытался ругаться =) Я знал что я не прав, но мне хотелось понять когда именно проявляется этот баг. теперь все понятно. спасибо. |
| Автор: Farmazon 13.7.2011, 18:33 |
| клерик всё грамотно задвинул ) |
| Автор: 4epT 13.7.2011, 23:41 | ||
| Хм, очень интересно ) сделал все как вы посоветовали ... в момент вызова любого метода dao класса у меня applicationContext = null. Вот код инициализации ApplicationContext:
сам arg0 - не пустой, в нем есть множество бинов .... в том чсиле и бин "countryDaoImpl" - это класс помеченный аннотацией @Repository. Так же в arg0 есть и бин - "sessionFactory", проинициализирован он вроде нормально (не null, хотя многие поля там все таки null, но мне кажется что так и должно быть). так же хочется заметить что в момент вызова метода "setApplicationContext" sessionFactory не null. Где то у меня происходит повторная инициализация либо какой то баг с временем жизни этого бина, хотя если время жизни бина заканчивается повторная его инициализация должна ведь заного все поля обносить. Поправьте если я ошибаюсь. |
| Автор: Farmazon 14.7.2011, 05:39 |
| У тебя DAO точно через контекст создаётся?... Для любого бина созданного в контексте и меющего интерфейс ApplicationContextAware вызывается метод setApplicationContext... Кажется, как будто ты DAO вне контекста создал... |
| Автор: 4epT 14.7.2011, 08:30 |
| setApplicationContext у меня вызывается в момент когда стартует томкет, это означает что этот бин создается именно в контексте ? |
| Автор: 4epT 14.7.2011, 09:23 | ||
| А как правильно инициализировать DAO бин ? Мне нужно что бы он был проинициализирован в JSF бине .... я делаю вот так вот:
но counrtyDao = null (( |
| Автор: MisterCleric 14.7.2011, 09:28 |
| Вот!!! Ты же о JSF ничего не говорил. У тебя @Autowired получается NULL, потому как ты этот UserBean достаешь не из Spring контейнера, а из JSF контейнера. Что бы все нормально работало, надо все JSF-обращение отделегировать в Spring. Т.е. тебе нужно сконфигурить только один контейнер - Spring. А JSF будет им пользоваться. Почитай про интерагцию JSF+Spring и будет тебе счастье. Я тут на форуме тоже не раз уже об этом писал. |
| Автор: 4epT 14.7.2011, 09:44 |
| Окей, почитаю ) спасибо! А как насчет варианта что бы сделать класс в котором все спринг бины будут статик ? и из JSF выдергивать нужные бины ? |
| Автор: MisterCleric 14.7.2011, 10:13 |
| Не-а. Такое не нужно у тебя уже есть такой объект - applicationContext. Ты его можешь сделать статик полем в каком-то классе, и инициализировать это static поле каким-то ServletContextListener. И доставая applicationContext с помощью WebApplicationContextUtils Но, по-моему, это излишне. Можно всегда выкрутиться теми способами, которые уже существую и показали себя со временем. |
| Автор: 4epT 17.7.2011, 19:03 | ||||||
Попробовал так как ты посоветовал ) Дописал в web.xml:
Добавил faces-config.xml:
Managed bean остался таким же:
Но при вызове метода, countryDao = null. Это означает что этот бин находиться не в том контексте ? |
| Автор: MisterCleric 17.7.2011, 22:10 | ||
| Привет. Конечно не там. Если ты уж перешел на Spring, то и отказывайся от JSF-контейнера. Это class должен быть помечен так:
т.е. сделай его полностью spring'овским |
| Автор: 4epT 17.7.2011, 22:14 |
| Так и думал .... сейчас попробую ) И еще такой вопрос, во многих примерах (почти все такие находил) спринг бин (в данном случае countryDao), инжекстится (managed-property) в jsf бин, и в faces-config прописываются другой параметр (не помню как называется )... почему везде приводят именно такой пример ? |
| Автор: 4epT 17.7.2011, 23:04 | ||||
После того как сделал UserBean полностью спринговым, стало писать вот такое:
Как мне теперь работать с этим бином ? я не могу с ним работать так как с managed jsf bean ? В бине объявлены два поля:
и для них созданы get и set методы |