2016-02-15 1 views
0

de quelques jours J'essaie de résoudre le problème qui se produit dans mon programme, j'ai essayé plusieurs façons de résoudre, mais rien n'a fonctionné. Voici la trace de la pile:Compilateur doesn 'voir bean créé

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'usersDao': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory com.caveofprogramming.spring.web.dao.UsersDao.sessionFactory; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.hibernate.SessionFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:288) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1116) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) 
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5077) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5591) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:4097) 
    at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:425) 
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1344) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1545) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1555) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1555) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1523) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory com.caveofprogramming.spring.web.dao.UsersDao.sessionFactory; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.hibernate.SessionFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:514) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285) 
    ... 24 more 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.hibernate.SessionFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:986) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:856) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:768) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486) 
    ... 26 more 

Voilà ma classe UsersDao:

package com.caveofprogramming.spring.web.dao; 

import java.util.List; 

import javax.sql.DataSource; 

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; 
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; 
import org.springframework.security.crypto.password.PasswordEncoder; 
import org.springframework.stereotype.Component; 
import org.springframework.transaction.annotation.Transactional; 

@Transactional 
@Component("usersDao") 
public class UsersDao { 

    private NamedParameterJdbcTemplate jdbc; 

    @Autowired 
    private PasswordEncoder passwordEncoder; 

    @Autowired 
    private SessionFactory sessionFactory; 

    @Autowired 
    public void setDataSource(DataSource jdbc) { 
     this.jdbc = new NamedParameterJdbcTemplate(jdbc); 
    } 

    public Session session() { 
     return sessionFactory.getCurrentSession(); 
    } 

    @Transactional 
    public boolean create(User user) { 

     MapSqlParameterSource params = new MapSqlParameterSource(); 

     params.addValue("username", user.getUsername()); 
     params.addValue("password", passwordEncoder.encode(user.getPassword())); 
     params.addValue("email", user.getEmail()); 
     params.addValue("name", user.getName()); 
     params.addValue("enabled", user.isEnabled()); 
     params.addValue("authority", user.getAuthority()); 

     return jdbc.update(
       "insert into users (username, name, password, email, enabled, authority) values (:username, :name, :password, :email, :enabled, :authority)", 
       params) == 1; 
    } 

    public boolean exists(String username) { 
     return jdbc.queryForObject("select count(*) from users where username=:username", 
       new MapSqlParameterSource("username", username), Integer.class) > 0; 
    } 

    @SuppressWarnings("unchecked") 
    public List<User> getAllUsers() { 
     return session().createQuery("from User").list(); 
     // return jdbc.query("select * from users", 
     // BeanPropertyRowMapper.newInstance(User.class)); 
    } 

} 

Voici mon dao-context.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:context="http://www.springframework.org/schema/context" 
    xmlns:jee="http://www.springframework.org/schema/jee" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd 
     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-3.2.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"> 


    <context:annotation-config></context:annotation-config> 
    <context:component-scan base-package="com.caveofprogramming.spring.web.dao"> 
    </context:component-scan> 

    <beans profile="production"> 

     <jee:jndi-lookup jndi-name="jdbc/spring" id="dataSource" 
      expected-type="javax.sql.DataSource"> 
     </jee:jndi-lookup> 

     <bean id="transactionManager" 
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
      <property name="dataSource" ref="dataSource"></property> 
     </bean> 
     <tx:annotation-driven /> 

    </beans> 

</beans> 

Et voici mon datasource.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:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    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-3.2.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"> 

    <context:component-scan base-package="com.caveofprogramming.spring.test"> 
    </context:component-scan> 

    <beans profile="dev"> 
     <context:property-placeholder 
      location="com/caveofprogramming/spring/web/test/config/jdbc.properties" /> 

     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
      destroy-method="close"> 

      <property name="driverClassName" value="${jdbc.driver}"></property> 
      <property name="url" value="${jdbc.url}"></property> 
      <property name="password" value="${jdbc.password}"></property> 
      <property name="username" value="${jdbc.username}"></property> 
     </bean> 

     <bean id="sessionFactory" 
      class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
      <property name="dataSource" ref="dataSource"></property> 
      <property name="hibernateProperties"> 
       <props> 
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
       </props> 
      </property> 
      <property name="packagesToScan"> 
       <list> 
        <value>com.caveofprogramming.spring.web.dao</value> 
       </list> 
      </property> 
     </bean> 

     <bean id="transactionManager" 
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
      <property name="dataSource" ref="dataSource"></property> 
     </bean> 
     <tx:annotation-driven /> 

    </beans> 


</beans> 

Voici la structure du programme:

program structure

Toutes les idées ce qui est incorrect dans le code? Je serai très reconnaissant pour toutes les idées, parce que j'ai déjà perdu beaucoup d'heures à essayer de résoudre cela.

Répondre

0

Le bean "sessionFactory" que vous avez est un factory for creating SessionFactory instances. Une usine d'usine, si vous voulez. Il n'implémente pas l'interface Hibernate SessionFactory directement.

Essayez d'ajouter un autre bean à votre configuration est SessionFactory obtenue à partir de cette usine:

<bean id="hibernateSessionFactory" 
    factory-bean="sessionFactory" 
    factory-method="newSessionFactory"/> 
+0

J'ai collé que dans mon datasource.xml, mais il est toujours la même erreur. Dois-je changer quelque chose? – Greg

+0

Peut-être que le fichier datasource.xml n'est pas inclus dans votre contexte Spring. Comment allez-vous amorcer le printemps? Essayez-vous de le charger uniquement pendant les tests? – bdkosher