首页 > 解决方案 > 通过 'sessionFactory' 不满足的依赖关系;没有可用的“org.hibernate.SessionFactory”类型的合格 bean

问题描述

我正在创建一个 spring-mvc 和 hibernate webapp。我正在尝试通过创建项目(因此使用 xml 配置)来测试书中阅读的文本。以前有人问过这类问题,但我无法让我的项目使用所提供的答案。到达终点时出现以下错误:

[WARNING] Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'categoryController': Unsatisfied dependency expressed through field 'categoryService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'categoryServiceImpl': Unsatisfied dependency expressed through field 'categoryDAO'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'categoryDAOImpl': Unsatisfied dependency expressed through field 'sessionFactory'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.hibernate.SessionFactory' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=sessionFactory)}
[ERROR] Context initialization failed

这是@Configuration 类

@Configuration
@ComponentScan(basePackages= {"pizzaml.rest", "pizzaml.service", "pizzaml.dao"})
@EnableWebMvc
public class AppConfig {
    
    @Bean(name="sessionFactory")
    public SessionFactory sessionFactory( @Qualifier("dataSource") DataSource dataSource) throws MalformedURLException {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
            
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setConfigLocation(new FileUrlResource("/hibernate-cfg.xml"));
        return sessionFactory.getObject();
    }
    
    @Bean(name="dataSource")
    public DataSource dataSource( @Value("{db.user}") String user, @Value("{db.pass}") String pass, @Value("{db.url}") String url, @Value("{db.driverclass}") String driverClass) {
        BasicDataSource datasource = new BasicDataSource();
        datasource.setDriverClassName(driverClass);
        datasource.setUsername(user);
        datasource.setPassword(pass);
        datasource.setUrl(url);
        
        return datasource;
    }
    
}

这是hibernate-cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
        
    <hibernate-configuration>
        
        <session-factory>
            <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
            <property name="show_sql">true</property>
            <property name="hbm2ddl.auto">update</property>
            <mapping resource="pizzaml/entity/Category.hbm.xml"></mapping>
        </session-factory>
    
    </hibernate-configuration>

道-

@Repository
public class CategoryDAOImpl implements CategoryDAO {
    
    @Autowired
    @Qualifier("sessionFactory")
    SessionFactory sessionFactory;

    @Override
    public String addCategory(String categoryname) throws BusinessProcessException {
        
        Session session = sessionFactory.openSession();
        
        Query query = session.getNamedQuery("Category.byName");
        List<Category> list = query.list();
        
        if(Objects.nonNull(list) && (!list.isEmpty()) )
            throw new BusinessProcessException("Category already exists!");
        
        Category category = new Category();
        category.setName(categoryname);
        
        session.save(category);
        
        session.flush();
        
        session.close();
        
        return AppCodes.SUCCESS;
    }

}

pom.xml

  <dependencies>
  
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.4.22.Final</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-dbcp2</artifactId>
        <version>2.8.0</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.22</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.11.3</version>
    </dependency>
    
    
  </dependencies>
  
  <build>
    
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>    
        </plugin>
        
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.2.3</version>
            <configuration>
                <outputDirectory>./target</outputDirectory>
            </configuration>
        </plugin>
        
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <port>4500</port>
                <path>/</path>
            </configuration>
        </plugin>
        
    </plugins>

标签: javaspringhibernate

解决方案


您的 Hibernate 映射可能有问题,但是由于您没有发布有助于理解错误所在的整个堆栈跟踪,因此没有什么可以帮助您的。除此之外,我强烈建议您使用 Hibernate 的注释模型,因为 HBM XML 方法将在即将发布的版本之一中被 JPA orm.xml 方法取代。


推荐阅读