2017-02-28 4 views
0

Mes DaoClasshibernatetemplate.getSessionFactory() throws NullPointerException

@Repository("genObj") 
public class GeneralQueries { 
    HibernateTemplate hibernatetemplate; 
    public HibernateTemplate getHibernatetemplate() { 
     return hibernatetemplate; 
    } 
    public void setHibernatetemplate(HibernateTemplate hibernatetemplate) { 
     this.hibernatetemplate = hibernatetemplate; 
    } 
    public String getStringfromQuery(String sql) 
{ 
    SessionFactory sessionFactory=hibernatetemplate.getSessionFactory(); 
    Session session=sessionFactory.openSession(); 

    String data=null; 
    try 
    { 
     System.out.println(sql); 
     data=session.createSQLQuery(sql).list().toString(); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

    return data; 
}} 

Cette méthode renvoie les données comme chaîne

Mon contrôleur classe

@Controller 
public class SchoolStudentsConfirmationContrl 
{ 
    @Autowired 
    SchoolStudentsConfirmationIntr schoolstdconfirmservice; 
    @Autowired 
    GeneralQueries genObj=new GeneralQueries(); 

    @RequestMapping(value="/getData",method=RequestMethod.GET) 
    public ModelAndView getData(@ModelAttribute("schooldetailsform")SchoolDetailsForm formbean,HttpServletRequest request) 
    { 
     String PageHeading = ""; 


     try 
     { 
     String district = request.getSession().getAttribute("dist_code").toString(); 

     PageHeading = "BAS Students Confirmation for the Academic Year:"+ formbean.getAc_year() + " <br> District:" 
        + genObj.getStringfromQuery("select dist_name from pmss_districts_mst where dist_code=" + district + "")+""; 

     mav.setViewName("showreportwithmenu"); 

     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
     return mav; 
    } 
} 

Im essayant d'appeler la méthode genObj.getStringfromQuery() mais il me jette une exception de pointeur nul à la ligne SessionFactory sessionFactory = hibernatetemplate.getSessionFactory();

mon fichier de configuration

<?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:mvc="http://www.springframework.org/schema/mvc" 
    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-3.2.xsd 
     http://www.springframework.org/schema/mvc 
     http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
     http://www.springframework.org/schema/tx 
     http://www.springframework.org/schema/tx/spring-tx-3.2.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.2.xsd"> 

    <context:annotation-config /> 
    <context:component-scan base-package="cgg.gov.in.*" annotation-config="true"/> 


    <bean id="tiles" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
     <property name="viewClass"> 
      <value> 
       org.springframework.web.servlet.view.tiles3.TilesView 
      </value> 
     </property> 
    </bean> 

    <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer"> 
     <property name="definitions"> 
      <list> 
       <value>/WEB-INF/tiles.xml</value> 
      </list> 
     </property> 
    </bean> 

    <bean id="view" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/jsp/"/> 
    <property name="suffix" value=".jsp"/> 
    </bean> 

    <bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="org.postgresql.Driver" /> 
     <property name="url" value="jdbc:postgresql://x.x.x.x/test" /> 
     <property name="username" value="postgres" /> 
     <property name="password" value="postgres" /> 
    </bean> 

    <bean class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" name="sessionFactory"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop> 
       <prop key="hibernate.show_sql">false</prop> 
       <prop key="hibernate.hbm2ddl.auto">update</prop> 
       <prop key="hibernate.autocommit">false</prop> 
      </props> 
     </property> 
     <property name="annotatedClasses" > 
      <list> 
       <value>cgg.gov.in.model.login.LoginForm</value> 
      </list> 
     </property> 
    </bean> 

     <bean class="org.springframework.orm.hibernate4.HibernateTemplate" name="hibernatetemplate"> 
     <property name="sessionFactory" ref="sessionFactory"/> 
     </bean> 

    <mvc:default-servlet-handler /> 
    <mvc:annotation-driven /> 

</beans> 
+1

Vous effectuez 'newQueryQueries()' qui, fondamentalement, ne permet pas le câblage automatique, utilisez l'instance gérée par ressort. A côté de cela, il n'y a pas @ @ Autowired sur votre champ HIbernateTemplate dans votre dao. Aussi votre code est défectueux, n'utilisez jamais 'openSession' utilisez' getCurrentSession' à moins que vous ne vouliez rencontrer des problèmes étranges ('openSession' ouvre une nouvelle session et' Connection' si nécessaire, car vous ne fermez pas correctement que vous aurez la connexion fuites et fuites de mémoire pour commencer). –

+2

De même que vous travaillez avec 'Session' et' SessionFactory', je suggère d'arrêter d'utiliser 'HibernateTemplate' et d'injecter directement' SessionFactory' directement. –

Répondre

0

Vous avez un haricot défini hibernatetemplate. Mais vous n'avez pas dit de pointer la variable, hibernatetemplate dans la classe GeneralQueries, au bean défini.

Vous pouvez le faire de deux façons,

1) Créer un haricot pour GeneralQueries en XML et définir la propriété comme ci-dessous,

<bean name="generalQueries" class="package.GeneralQueries"> 
    <property name="hibernatetemplate" ref="hibernatetemplate" /> 
</bean> 

Vous avez déjà défini le poseur. N'oubliez pas de supprimer @Repository de GeneralQueries, si vous le définissez comme un bean dans xml.

2) autowire le hibernatetemplate dans GeneralQueries comme ci-dessous.

@Repository("genObj") 
public class GeneralQueries { 
    @Autowired 
    HibernateTemplate hibernatetemplate; 
    //rest of code 
} 

GeneralQueries doit être sous analyse de composants.

Note: En outre, @ m-Deinum suggéré, retirer new GeneralQueries() de SchoolStudentsConfirmationContrl.