升级Spring Boot与JDK后启动报PropertyReferenceException异常求助
Spring Boot版本升级启动失败问题解决方案
核心根因
报错核心为Spring Data JPA未识别到自定义方法的实现类,误将insertStrOpenDataForRebellion判定为基于StoredProcedureModel实体属性的查询方法,尝试生成查询语句时找不到对应属性导致启动失败。
该问题由两个版本变动共同触发:
- Spring Boot 2.0.3升级到2.4.9后,对应的Spring Data JPA版本大幅提升,对自定义Repository的命名规则、扫描规则校验严格度远高于旧版本,旧版本可兼容的不规范配置在新版本会直接报错
- JDK8升级到JDK11后,模块化类加载机制改变了默认类路径扫描逻辑,容易出现自定义实现类漏扫描的问题
修复步骤
- 修正自定义Repository命名规则:Spring Data JPA默认要求自定义实现类名称必须为「接口名+Impl」后缀,若你的接口名为
OracleTypeRepository,实现类必须命名为OracleTypeRepositoryImpl,不可修改后缀。 - 修正
@EnableJpaRepositories扫描配置:
现有配置仅扫描com.client.databaseservice.repositories包,而报错中OracleTypeRepository位于com.client.databaseservice.rptmaster.repository包下,需将该路径加入扫描范围,同时显式指定实现类后缀适配新版本校验,修正后配置如下:@EnableJpaRepositories( entityManagerFactoryRef = "oracleEntityManager", transactionManagerRef = "oracleTransactionManager", basePackages = {"com.client.databaseservice.repositories", "com.client.databaseservice.rptmaster.repository"}, implementationPostfix = "Impl" ) - 修正实体扫描路径:检查
StoredProcedureModel实体类是否在oracleEntityManager配置的扫描包com.client.databaseservice.transaction.models下,若不在需补充对应包路径:@Bean(name = "oracleEntityManager") public LocalContainerEntityManagerFactoryBean postgresqlEntityManagerFactory(EntityManagerFactoryBuilder builder) { return builder.dataSource(postgresqlDataSource()).properties(hibernateProperties()) // 补充StoredProcedureModel所在的包路径 .packages("com.client.databaseservice.transaction.models", "com.client.databaseservice.rptmaster.models") .persistenceUnit("oraclePU").build(); } - 校验方法签名一致性:确认
OracleTypeRepository接口中定义的insertStrOpenDataForRebellion方法,和实现类中的重写方法参数、返回值完全一致,无泛型擦除、参数类型不匹配问题。
内容的提问来源于stack exchange,提问作者Abhiram S
相关产品推荐
相关产品推荐

