无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&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
相关产品推荐
相关产品推荐

