0

Je vois tellement de questions à ce sujet et j'ai essayé de nombreuses permutations des nombreuses solutions différentes et aucune n'a fonctionné.La SessionFactory hibernate est toujours nulle dans mon DAO pour une classe Java régulière

J'ai un dao qui nécessite une session session hibernate pour faire des transactions. Dans le contexte SpringMVC, je l'ai vu fonctionner mais le dao inclus dans une classe java est nul. Il n'y a pas d'erreur dans catalina.out:

mon plein applicationContext.xml (parce que je pense vraiment que le problème est ici quelque part):

<?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> 

La classe pour laquelle le DAO, mais pas SessionFactory peut être trouvé :

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

le début de la DAO (essayé autwiring ne getter & setters et un constructeur):

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

    @Autowired 
    private SessionFactory sessionFactory; 
etc... 

Le XML WEB lignes de printemps:

<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> 

La seule autre mise en garde à ce sujet est que je tente d'obtenir ce à travailler dans un CMS java opensource appelé OpenCMS. Mais je ne suis pas sûr que ce soit pertinent car les fichiers que je suis en train de câbler sont de la classe de support vanilla java, pas des contrôleurs ou quoi que ce soit (ne cherchant pas encore à faire Spring-MVC avec ça).

En fait, tout ceci fonctionne dans un contexte de servlet Spring MVC sur une application plus petite, mais je n'arrive pas à obtenir ces mêmes objets/annotations à enregistrer dans le contexte applicationContext.

+0

Dans quel paquet se trouve 'StudentDAO'? –

+0

Comment évaluez-vous l'objet CheckClassAccess et où sont ces classes/ces classes sont-elles sous le sous-package de com.shazam.di et essayez également de supprimer. * Dans le paquet scan –

+0

StudentDAO est dans com.shazam.di.spring.coursemgmt.dao –

Répondre

0

je n'étais pas en mesure de comprendre ce qui se passait, mais je résolu mon problème en tirant sur ma mise en œuvre du printemps et de travailler avec Hibernate directement.

Le nouveau travail à utiliser que Hibernate était tout droit:

  • J'ai ajouté dans un hibernate.cfg.xml et
  • j'ai enlevé quelques annotations de transactions gérées de printemps dans les méthodes de mon dao et ajouté que Mgmt de transaction retour manuellement
  • J'ai ajouté un singleton SessionFactory finale statique comme https://stackoverflow.com/a/15702946/1411545
  • j'ai enlevé printemps libs et les errants annotations de printemps.

La transition a pris tout peut-être une heure fonctionne bien et va me permettre de faire tout ce qu'il fallait pour ce projet. Je pense que j'ai fait un mauvais choix initial pour utiliser Spring ici, indépendamment de ce qui a fonctionné ou non.

Merci à tous pour vos nombreux commentaires et réponses utiles.

0

Si vous utilisez des annotations, le nommage est important. Donc changer votre StudentDAO comme suit:

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

Regardez this pour plus d'explications.

Vous pouvez également Spring recommande l'annotation @Resource:

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

Excellente info, mais pas le problème. J'ai seulement un SessionFactory donc par type devrait être bien. Pour être juste, la question initiale que j'ai posée s'est avérée ne pas être le problème. J'avais une vieille servlet de dispatcher toujours référencée dans le fichier web.xml pour Spring MVC dont j'avais déplacé des trucs pour les mettre dans le fichier applicationContext.xml et il se plaignait. Cela s'est avéré être un casse-tête, mais après avoir supprimé la référence servlet.xml, le fichier applicationContext.xml échoue silencieusement pour injecter quoi que ce soit, en ce moment j'essaie des solutions dans mes commentaires ci-dessus. –

Questions connexes