Модераторы: 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   Вверх
4epT
Дата 14.7.2011, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А как правильно инициализировать DAO бин ? Мне нужно что бы он был проинициализирован в JSF бине ....

я делаю вот так вот:
Код

@ManagedBean(name="user")
@SessionScoped
@Repository
public class UserBean implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    
    private String name;
    private String password;
    private List<Country> countryList;
    
    @Autowired
    private CountryDaoImpl countryDao;

но counrtyDao = null ((
PM MAIL   Вверх
MisterCleric
Дата 14.7.2011, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Вот!!!
Ты же о JSF ничего не говорил. У тебя  @Autowired получается NULL, потому как ты этот UserBean достаешь не из Spring контейнера, а из JSF контейнера.

Что бы все нормально работало, надо все JSF-обращение отделегировать в Spring. Т.е. тебе нужно сконфигурить только один контейнер - Spring. А JSF будет им пользоваться. 
Почитай про интерагцию JSF+Spring и будет тебе счастье.
Я тут на форуме тоже не раз уже об этом писал.



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


Опытный
**


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

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



Окей, почитаю ) спасибо!

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

Это сообщение отредактировал(а) 4epT - 14.7.2011, 09:46
PM MAIL   Вверх
MisterCleric
Дата 14.7.2011, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Не-а. Такое не нужно у тебя уже есть такой объект - applicationContext. Ты его можешь сделать статик полем в каком-то классе, и инициализировать это static поле каким-то ServletContextListener.
И доставая applicationContext с помощью WebApplicationContextUtils
Но, по-моему, это излишне. Можно всегда выкрутиться теми способами, которые уже существую и показали себя со временем.


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


Опытный
**


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

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



Попробовал так как ты посоветовал ) Дописал в web.xml:

Код

       <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>


Добавил faces-config.xml:

Код

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">
 
    <application>
     <el-resolver>
         org.springframework.web.jsf.el.SpringBeanFacesELResolver
     </el-resolver>
    </application>
 
</faces-config>


Managed bean остался таким же:

Код

@ManagedBean
@SessionScoped
public class UserBean implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    
    private String name;
    private String password;
    private List<Country> countryList;
    
    @Autowired
    private CountryDaoImpl countryDao;


Но при вызове метода, countryDao = null. Это означает что этот бин находиться не в том контексте ?
PM MAIL   Вверх
MisterCleric
Дата 17.7.2011, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Привет.
Конечно не там.
Если ты уж перешел на Spring, то и отказывайся от JSF-контейнера.
Это  class должен быть помечен так:
Код

@Service
@Scope("session")
public class UserBean implements Serializable {

т.е. сделай его полностью spring'овским


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


Опытный
**


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

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



Так и думал .... сейчас попробую )

И еще такой вопрос, во многих примерах (почти все такие находил) спринг бин (в данном случае countryDao), инжекстится (managed-property) в jsf бин, и в faces-config прописываются другой параметр (не помню как называется )... почему везде приводят именно такой пример ?

Это сообщение отредактировал(а) 4epT - 17.7.2011, 22:26
PM MAIL   Вверх
4epT
Дата 17.7.2011, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



После того как сделал UserBean полностью спринговым, стало писать вот такое:

Код

/index.xhtml @15,59 value="#{userBean.name}": Property 'name' not found on type $Proxy17


Как мне теперь работать с этим бином ? я не могу с ним работать так как с managed jsf bean ? 

В бине объявлены два поля: 

Код

    private String name;
    private String password;


и для них созданы get и set методы

Это сообщение отредактировал(а) 4epT - 17.7.2011, 23:06
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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