Tomcat运行非Spring Boot的Spring Maven项目创建activityController Bean失败
根因分析
你在项目中引入了Spring Data JPA并自定义了继承JpaRepository的ActivityDAO接口,但Spring配置类未开启Spring Data JPA的仓库扫描能力,框架无法自动识别并创建ActivityDAO的实现类Bean,因此触发依赖注入失败报错。另外还存在版本不兼容、JPA实体扫描缺失的潜在问题。
解决步骤
1. 修正AppConfig配置类
在AppConfig上添加两个注解:
@EnableJpaRepositories:指定Repository接口所在包,开启Spring Data JPA仓库自动实现能力@EntityScan:指定JPA实体类所在包,让框架识别所有@Entity标注的实体类
修正后的AppConfig代码如下:
package com.calendar.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.orm.jpa.LocalEntityManagerFactoryBean; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.boot.autoconfigure.domain.EntityScan; @Configuration @EnableWebMvc @EnableTransactionManagement @ComponentScan(basePackages = "com.calendar") @EnableJpaRepositories(basePackages = "com.calendar.repository") @EntityScan(basePackages = "com.calendar.entity") public class AppConfig implements WebMvcConfigurer { @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } @Bean(name = "Calendar_PU") public LocalEntityManagerFactoryBean getEntityManagerFactoryBean() { LocalEntityManagerFactoryBean factoryBean = new LocalEntityManagerFactoryBean(); factoryBean.setPersistenceUnitName("Calendar_PU"); return factoryBean; } }
2. 检查persistence.xml配置
确认你在src/main/resources/META-INF路径下存在persistence.xml文件,且文件中持久化单元的名称和你配置的Calendar_PU一致,示例配置参考:
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"> <persistence-unit name="Calendar_PU" transaction-type="RESOURCE_LOCAL"> <class>com.calendar.entity.Activity</class> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/> <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/> <property name="hibernate.connection.url" value="你的数据库连接地址"/> <property name="hibernate.connection.username" value="数据库用户名"/> <property name="hibernate.connection.password" value="数据库密码"/> <property name="hibernate.hbm2ddl.auto" value="update"/> <property name="hibernate.show_sql" value="true"/> </properties> </persistence-unit> </persistence>
3. 修复版本兼容问题
你当前使用的Spring 5.1.4.RELEASE和Spring Data JPA 2.4.7版本不兼容,Spring Data JPA 2.4.x要求Spring框架版本最低为5.3.x,两种修复方案二选一:
- 方案1:将pom.xml中所有
springframework.version升级到5.3.20 - 方案2:将pom.xml中
spring-data-jpa的版本降到2.1.21.RELEASE
完成以上三步后重新打包部署即可解决问题。
内容的提问来源于stack exchange,提问作者Francesco Morganti
相关产品推荐
相关产品推荐

