0

Я вижу так много вопросов по этому вопросу и пробовал множество перестановок из множества различных решений, и никто из них не работал.Спящий сеансFactory всегда имеет значение null в моем DAO для обычного класса Java

У меня есть dao, для выполнения транзакций требуется спящий сеанс. В контексте SpringMVC я видел, что он работает, но dao, включенное в класс java, имеет значение null. Там нет ошибки в catalina.out:

мой полный applicationContext.xml (потому что я действительно думаю, что проблема где-то здесь):

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:context="http://www.springframework.org/schema/context" 

    xsi:schemaLocation= 
    "http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd"> 

<!-- Scan classpath for annotations (eg: @Service, @Repository etc)--> 

<context:annotation-config/> 

<context:component-scan base-package="com.shazam.di.*" /> 

<!-- JNDI Data Source. this works I can get to it independent of spring--> 
<bean id="myDataSource" class="org.springframework.jndi.JndiObjectFactoryBean" 
scope="singleton"> 
    <property name="jndiName" value="jdbc/dostudentdb"/> 
    <property name="resourceRef" value="true"/> 
</bean> 

<tx:annotation-driven/> 

<!-- Hibernate Session Factory --> 
<bean id="mySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="myDataSource"/> 
    <property name="packagesToScan"> 
    <array> 
     <value>com.shazam.di.spring.coursemgmt.dao</value> 
    </array> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.show_sql">false</prop> 
      <!--<prop key="hibernate.hbm2ddl.auto">update</prop>--> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
     </props>   
    </property> 
</bean> 

<!-- Hibernate Transaction Manager --> 
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="mySessionFactory"/> 
</bean> 

<!--I've alternated between contructor, properties for getters & setters --> 
<!--here, and nothing (just letting it get autowired into the private--> 
<!--SessionFactory instance, no effing cigar!!--> 
<bean id="studentDAO" class="org.shazam.di.spring.coursemgmt.dao.StudentDAO"> 
    <!--<constructor-arg type="SessionFactory" value="mySessionFactory"/>--> 
    <property name="insertUserProfile" ref="insertUserProfile"/> 
</bean> 
</beans> 

Класс, для которого DAO, но не SessionFactory можно найти :

@Component 
public class CheckClassAccess 
{ 
    @Autowired 
    private static StudentDAO studentDAO;... 

начало DAO (попытался autwiring только добытчика & сеттеры и конструктор):

@Repository 
@SuppressWarnings({"unchecked", "rawtypes"}) 
public class StudentDAO { 

    @Autowired 
    private SessionFactory sessionFactory; 
etc... 

Весенние линии WEB XML:

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath*:WEB-INF/applicationContext.xml</param-value> 
</context-param>  
and then a little later... 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

Единственный нюанс к этому является то, что я пытаюсь получить эту работу внутри открытым исходным кодом ява СЦИ под названием OpenCMS. Но не уверен, что это актуально, так как файлы, к которым я подключаюсь, - это класс поддержки vanilla java, а не контроллеры или что-то в этом роде (на самом деле это не похоже на Spring-MVC).

Фактически все это работает в контексте сервлета Spring MVC на отдельном небольшом приложении, но я просто не могу заставить эти те же объекты/аннотации регистрироваться в applicationContext.

+0

В какой упаковке «StudentDAO»? –

+0

Как вы оцениваете объект CheckClassAccess и были ли эти классы/эти классы попадают под дополнительный пакет com.shazam.di, а также попытаться удалить. * В сканировании пакетов –

+0

StudentDAO находится в com.shazam.di.spring.coursemgmt.dao –

ответ

0

я не смог понять, что происходит, но я решил мою проблему, потянув за мою реализацию Spring и работать с Hibernate непосредственно.

Повторная работа использовать Hibernate только был прямой:

  • Я добавил в hibernate.cfg.xml и
  • я удалил некоторые пружине удалось аннотаций транзакций в методах моей дао и добавил что транзакция mgmt назад вручную
  • Я добавил статический окончательный SingleSign SessionFactory как https://stackoverflow.com/a/15702946/1411545
  • Я удалил Spring libs и любые бродячие аннотации Spring.

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

Благодарим вас за много полезных комментариев и ответов.

0

Если вы используете вопросы, связанные с аннотациями. Таким образом изменить StudentDAO следующим образом:

@Autowired 
@Qualifier("mySessionFactory") 
private SessionFactory sessionFactory; 

Посмотрите на this для более подробного объяснения.

В качестве альтернативы Spring рекомендует @Resource аннотацию:

@Resource("mySessionFactory") 
private SessionFactory sessionFactory; 
+0

Отличная информация, но не проблема. У меня только один SessionFactory, поэтому по типу должно быть хорошо. Чтобы быть справедливым, начальный вопрос, который я задал, оказался не проблемой. У меня был старый сервлет диспетчера, который все еще упоминается в web.xml для Spring MVC, что я переместил кое-что из него, чтобы положить его в applicationContext.xml, и он жаловался. Это оказалось красной селедкой, но после того, как я удалил ссылку servlet.xml, applicationContext.xml терпит неудачу, чтобы что-то вводить, прямо сейчас я пытаюсь найти решения в моих комментариях выше. –