2016-07-05 2 views
0

L'extrait suivant d'une définition de contexte d'application XML montre comment je mis au point une JDBC DataSource et une mise en veille prolongée SessionFactory au-dessus de celui-ci:configuration SessionFactory dans un conteneur Spring

<context:component-scan base-package="com.phoneBook.dao" /> 
    <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <property name="driverClassName" value="org.postgresql.Driver" /> 
     <property name="url" value="jdbc:postgresql://localhost:5432/postgres?currentSchema=phoneBook" /> 
     <property name="username" value="postgres" /> 
     <property name="password" value="a1f10g" /> 
     <property name="initialSize" value="20" /> 
     <property name="maxActive" value="100"/> 
    </bean> 
    <bean id="mySessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="myDataSource"/> 
     <property name="hibernateProperties"> 
      <value> 
       hibernate.dialect=org.hibernate.dialect.PostgreSQL94Dialect 
      </value> 
     </property> 
     <property name="annotatedClasses"> 
      <list> 
       <value>com.phoneBook.model.Address</value> 
       <value>com.phoneBook.model.Contact</value> 
       <value>com.phoneBook.model.User</value> 
       <value>com.phoneBook.model.Lang</value> 
      </list> 
     </property> 
    </bean> 
    <bean id="myProductDao" class="com.phoneBook.dao.Impl.AddressDaoImpl"> 
     <property name="sessionFactoryBean" ref="mySessionFactory"/> 
    </bean> 

et basé sur ce contexte, je créé mon dao classe, dont une partie est présentée ci-dessous

package com.phoneBook.dao.Impl; 

@Repository 
    public class AddressDaoImpl implements AddressDao{ 
     private Session currentSession; 
     private Transaction currentTransaction; 
     private LocalSessionFactoryBean sessionFactoryBean; 
     private SessionFactory sessionFactory;  
     public SessionFactory getSessionFactory() { 
      return (SessionFactory) sessionFactoryBean.getObject(); 
     } 

     public void setSessionFactory(SessionFactory sessionFactory) { 
      this.sessionFactory = sessionFactory; 
     }  
     public LocalSessionFactoryBean getSessionFactoryBean() { 
      return sessionFactoryBean; 
     }  
     public void setSessionFactoryBean(LocalSessionFactoryBean sessionFactoryBean) { 
      this.sessionFactoryBean = sessionFactoryBean; 
     } 

mais quand je lance mon test j'ai NPE, quelqu'un peut me expliquer ce que je fais mal

@Test 
public void addressTest(){ 
    AddressDaoImpl addressDao = new AddressDaoImpl(); 

    try { 
     addressDao.openSessionWithTransaction(); 
     System.out.print(addressDao.findById(1).toString()); 
     addressDao.openSessionWithTransaction(); 
    } catch (DataBaseException e) { 
     addressDao.closeSessionWithTransaction(); 
     e.printStackTrace(); 
    } 
+0

Veuillez ajouter les packages à votre code. – Jens

+0

Utilisez des annotations ou une configuration XML. Pas tous les deux – Jens

+0

@Jens, j'ai ajouté des paquets – Jungle

Répondre

0

Vous devez lier automatiquement le AddressDaoImpl en vous TESTCASE:

@Test 
public void addressTest(){ 

    @Autowired 
    AddressDaoImpl addressDao 

Ou mieux utiliser l'interface:

@Test 
public void addressTest(){ 

    @Autowired 
    AddressDao addressDao 

Ne pas oublier de lancer votre test avec:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("classpath*:<your configuration>") 

Car Autowiering fonctionne uniquement dans les beans gérés par conteneur, pas si vous créez votre bean avec le mot clé new.

+0

Je ne peux pas ajouter '@ Autowire' à' sessionFactory'. J'ai eu cette invite - Impossible d'autowire. Aucun bean de type 'LocalSessionFactoryBean' trouvé. – Jungle

+0

Vous ne devez pas ajouter @Autowired à 'sessionFactory. Vous devriez l'ajouter à addressDao – Jens