You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无Maven的Spring动态Web项目依赖注入异常求助

问题描述

我希望通过Spring MVC将数据存储到数据库,但项目启动时遇到如下上下文初始化异常:

WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'homeController': Unsatisfied dependency expressed through field 'sci'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'serviceImpl': Unsatisfied dependency expressed through field 'di'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'daoImpl': Unsatisfied dependency expressed through field 'sf'; 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)}
Aug 29, 2023 9:44:19 AM org.springframework.web.servlet.FrameworkServlet initServletBean
SEVERE: Context initialization failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'homeController': Unsatisfied dependency expressed through field 'sci'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'serviceImpl': Unsatisfied dependency expressed through field 'di'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'daoImpl': Unsatisfied dependency expressed through field 'sf'; 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)}
核心原因

异常链的根因是Spring容器中不存在org.hibernate.SessionFactory类型的Bean,导致daoImpl中通过@Autowired注入的sf字段无法找到依赖,进而引发层层依赖注入失败。

解决方案
  • 在Spring配置中定义SessionFactory Bean
    若使用XML配置,添加如下配置:

    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="packagesToScan" value="com.yourpackage.model"/> <!-- 替换为你的实体类所在包 -->
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</prop> <!-- 对应你的数据库方言 -->
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>
    
    <!-- 数据源配置示例 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/your_db?useSSL=false&amp;serverTimezone=UTC"/>
        <property name="username" value="root"/>
        <property name="password" value="your_password"/>
    </bean>
    

    若使用Java配置,编写配置类:

    @Configuration
    @EnableTransactionManagement
    public class HibernateConfig {
    
        @Bean
        public DataSource dataSource() {
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC");
            dataSource.setUsername("root");
            dataSource.setPassword("your_password");
            return dataSource;
        }
    
        @Bean
        public LocalSessionFactoryBean sessionFactory() {
            LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
            sessionFactory.setDataSource(dataSource());
            sessionFactory.setPackagesToScan("com.yourpackage.model");
            sessionFactory.setHibernateProperties(hibernateProperties());
            return sessionFactory;
        }
    
        private Properties hibernateProperties() {
            Properties props = new Properties();
            props.put("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect");
            props.put("hibernate.show_sql", "true");
            props.put("hibernate.hbm2ddl.auto", "update");
            return props;
        }
    }
    
  • 检查组件扫描范围
    确保Spring的组件扫描配置覆盖了SessionFactory所在的配置类包。比如XML中的<context:component-scan base-package="com.yourpackage.config,com.yourpackage.service,com.yourpackage.dao"/>,或Java配置中的@ComponentScan(basePackages = {"com.yourpackage"}),要包含所有需要Spring管理的类所在包。

  • 验证DaoImpl的注入配置
    检查daoImpl中的SessionFactory字段是否正确使用@Autowired,无拼写错误:

    @Repository
    public class DaoImpl implements Dao {
        @Autowired
        private SessionFactory sf; // 字段名和类型需匹配配置的Bean类型
    
        // 业务方法...
    }
    
  • 确认依赖完整性
    检查项目依赖(如Maven的pom.xml)是否包含Spring ORM和Hibernate核心依赖:

    <dependencies>
        <!-- Spring MVC -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.20</version>
        </dependency>
        <!-- Spring ORM for Hibernate integration -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>5.3.20</version>
        </dependency>
        <!-- Hibernate Core -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.6.10.Final</version>
        </dependency>
        <!-- MySQL Driver -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>
    </dependencies>
    

内容的提问来源于stack exchange,提问作者Sajed Ibrahim Shaikh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 02:34:56