Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> @Autowired SessionFactory null 
:(
    Опции темы
4epT
Дата 13.7.2011, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: 3
Всего: 3



Доброе утро, собственно проблема в том, что после конфигурации SessionFactory через Spring он не инициализируется.

Вот его конфигурация:

Код

<!-- Непосредственно бин dataSource -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
        <property name="url"><value>${jdbc.url}</value></property>
        <property name="username"><value>${jdbc.username}</value></property>
        <property name="password"><value>${jdbc.password}</value></property>
    </bean>

    <!-- Настройки фабрики сессий Хибернейта -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation">
            <value>/WEB-INF/hibernate.cfg.xml</value>
        </property>
        <property name="configurationClass">
            <value>org.hibernate.cfg.AnnotationConfiguration</value>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
                <prop key="hibernate.connection.charSet">UTF-8</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>


Файл hibernate.cfg.xml:

Код

<hibernate-configuration>
    <session-factory>
        <mapping class="com.model.User" />
        <mapping class="com.model.Country" />
    </session-factory>
</hibernate-configuration>


Так же в файле конфигурации указываю какие пакеты сканировать:

Код

<!-- Включаем опцию использования конфигурационных аннотаций (@Annotation-based configuration)-->
    <context:annotation-config />

    <context:component-scan base-package="com.dao" />


В DAO классе создается приватная переменная sessionFactory (get и set методы я для нее не делал) .... и в момент вызова какого либо метода класса sessionFactory null.

Кто может подсказать что я не правильно делаю ?
PM MAIL   Вверх
Farmazon
Дата 13.7.2011, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 7.7.2006

Репутация: 3
Всего: 5



На самом DAO какие нибудь ещё аннотации висят?... безопасность, транзакции...

Посмотри типы бинов в рантайме sessionFactory и dao-бинов...


--------------------
Таково моё общее мнение.
PM MAIL WWW   Вверх
4epT
Дата 13.7.2011, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: 3
Всего: 3



Цитата(Farmazon @ 13.7.2011,  10:29)
На самом DAO какие нибудь ещё аннотации висят?... безопасность, транзакции...

На самом DAO классе висит еще аннотация @Repository, в транзакции методы пока что не оборачивал.

Цитата

Посмотри типы бинов в рантайме sessionFactory и dao-бинов...


а вот насчет этого можно поподробнее ? Как посмотреть и зачем ?

Это сообщение отредактировал(а) 4epT - 13.7.2011, 10:52
PM MAIL   Вверх
Farmazon
Дата 13.7.2011, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 7.7.2006

Репутация: 3
Всего: 5



Да сделай так, чтобы тот же DAO реализовывал интерфейс ApplicationContextAware. Он добавит метод, где присваивается applicationContext, сохрани его в какое-нибудь поле класса. Затем в методе, который можешь вызвать, брось брекпоинт. А в отладке на брекпоинте через watch можно повызывать метод getBean с разными параметрами у контекста. Он будет возвращать бины. Так можно проверить, существуют ли бины в контексте, в каком количестве и какой у них класс... Короче можно посмотреть что творится с контекстом в рантайме.


--------------------
Таково моё общее мнение.
PM MAIL WWW   Вверх
4epT
Дата 13.7.2011, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: 3
Всего: 3



Цитата(Farmazon @ 13.7.2011,  11:28)
Да сделай так, чтобы тот же DAO реализовывал интерфейс ApplicationContextAware. Он добавит метод, где присваивается applicationContext, сохрани его в какое-нибудь поле класса. Затем в методе, который можешь вызвать, брось брекпоинт. А в отладке на брекпоинте через watch можно повызывать метод getBean с разными параметрами у контекста. Он будет возвращать бины. Так можно проверить, существуют ли бины в контексте, в каком количестве и какой у них класс... Короче можно посмотреть что творится с контекстом в рантайме.

Хорошо, попробую .. и отпишусь о результате ) Спасибо!

P.s. я надеюсь это ведь делается только для отладки ?)
PM MAIL   Вверх
Farmazon
Дата 13.7.2011, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 7.7.2006

Репутация: 3
Всего: 5



applicationContext бывает удобно получать бинам-синглтонам, чтоб они могли выдёргивать из контекста прототипы и сессионные бины...


--------------------
Таково моё общее мнение.
PM MAIL WWW   Вверх
4epT
Дата 13.7.2011, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: 3
Всего: 3



А чем удобнее выдергивать бины из контекста, чем сразу описать нужные бины полями в классе ?
PM MAIL   Вверх
MisterCleric
Дата 13.7.2011, 12:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Цитата

А чем удобнее выдергивать бины из контекста, чем сразу описать нужные бины полями в классе ? 

Получишь такой баг как "Scope Impedance".
Выйдет ситуация такая: твой бин в scope="singleton" "проаутоварится" бинами в более низком scope только один раз - при инициализации. И зашарит эти поля для всех конечных пользователей.


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
4epT
Дата 13.7.2011, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: 3
Всего: 3



Не очень понятно насчет бага ... в конечном счете он все равно про инициализирует эти поля и с этими полями можно будет нормально работать.

Например я ведь могу сделать singleton класс, в котором будут "аутоварится" все бины (к примеру Dao классы). все бины сделать static, и через этот класс всегда доставать нужный мне бин ... как тут проявится этот баг ?
PM MAIL   Вверх
MisterCleric
Дата 13.7.2011, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



4epT
Ты привел пример, когда все бины у тебя сервисы. А вот что ты будешь делать, если у тебя этот синглетонный сервис на этапе вызова должен обслужить сессионные данные конкретного пользователя?
Сначала почитай , а потом ругайся


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
4epT
Дата 13.7.2011, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: 3
Всего: 3



Цитата(MisterCleric @ 13.7.2011,  13:42)
4epT
Ты привел пример, когда все бины у тебя сервисы. А вот что ты будешь делать, если у тебя этот синглетонный сервис на этапе вызова должен обслужить сессионные данные конкретного пользователя?
Сначала почитай , а потом ругайся

Ты меня не правильно понял. Я даже не пытался ругаться =) Я знал что я не прав, но мне хотелось понять когда именно проявляется этот баг. теперь все понятно. спасибо.
PM MAIL   Вверх
Farmazon
Дата 13.7.2011, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 7.7.2006

Репутация: 3
Всего: 5



клерик всё грамотно задвинул )


--------------------
Таково моё общее мнение.
PM MAIL WWW   Вверх
4epT
Дата 13.7.2011, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: 3
Всего: 3



Хм, очень интересно ) сделал все как вы посоветовали ... в момент вызова любого метода dao класса у меня applicationContext = null.

Вот код инициализации ApplicationContext:
Код

public void setApplicationContext(ApplicationContext arg0)
        throws BeansException {
    this.applicationContext = arg0;
}


сам arg0 - не пустой, в нем есть множество бинов .... в том чсиле и бин "countryDaoImpl" - это класс помеченный аннотацией  @Repository.
Так же в arg0 есть и бин - "sessionFactory", проинициализирован он вроде нормально (не null, хотя многие поля там все таки null, но мне кажется что так и должно быть).

так же хочется заметить что в момент вызова метода "setApplicationContext" sessionFactory не null. 

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

Это сообщение отредактировал(а) 4epT - 14.7.2011, 00:02
PM MAIL   Вверх
Farmazon
Дата 14.7.2011, 05:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 7.7.2006

Репутация: 3
Всего: 5



У тебя DAO точно через контекст создаётся?... Для любого бина созданного в контексте и меющего интерфейс ApplicationContextAware вызывается метод setApplicationContext...
Кажется, как будто ты DAO вне контекста создал...

Это сообщение отредактировал(а) Farmazon - 14.7.2011, 05:40


--------------------
Таково моё общее мнение.
PM MAIL WWW   Вверх
4epT
Дата 14.7.2011, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: 3
Всего: 3



setApplicationContext у меня вызывается в момент когда стартует томкет, это означает что этот бин создается именно в контексте ? 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0892 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.