升级至Spring Boot 3.2.1后Dynamic Projections功能失效求助
Spring Boot 3.2.1升级后动态投影方法参数不匹配报错
将项目从Spring Boot 3.2.0升级到3.2.1后无法正常启动,核心错误指向GenericRepository#findProjectedById方法:
提供了至少2个参数,但查询中仅存在1个参数
完整错误栈:
2024-01-09T21:02:14.081+02:00 WARN 25839 --- [ restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'webSecurityConfig' defined in file [/home/martin/Dev/Marketplace/target/classes/bg/softuni/marketplace/config/WebSecurityConfig.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'userService' defined in file [/home/martin/Dev/Marketplace/target/classes/bg/softuni/marketplace/service/UserServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'userRepository' defined in bg.softuni.marketplace.repository.UserRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Could not create query for public abstract java.util.Optional bg.softuni.marketplace.repository.GenericRepository.findProjectedById(java.lang.Object,java.lang.Class); Reason: Failed to create query for method public abstract java.util.Optional bg.softuni.marketplace.repository.GenericRepository.findProjectedById(java.lang.Object,java.lang.Class); At least 2 parameter(s) provided but only 1 parameter(s) present in query
相关代码实现
通用仓库接口(使用动态投影)
@Validated @NoRepositoryBean public interface GenericRepository<E, I> extends JpaRepository<E, I> { <T extends Viewable<E>> Optional<T> findProjectedById(@NotNull I id, @NotNull Class<T> projection); //... }
用户仓库继承通用接口
@Validated @Repository public interface UserRepository extends GenericRepository<User, UUID> { //... }
业务层调用代码
@Override public Optional<String> getUsernameById(@NotNull UUID id) { return userRepository .findProjectedById(id, UserUsernameProjection.class) .map(UserUsernameProjection::getUsername); }
投影接口定义
public interface UserUsernameProjection extends Viewable<User> { String getUsername(); }
排查现状
- 升级到Spring Boot 3.2.1(对应Spring Framework 6.1.2)后触发该问题
- 查阅官方发布说明,未提及相关破坏性变更
- 未找到其他同类问题案例,寻求解决方向提示
内容的提问来源于stack exchange,提问作者MartinBG
相关产品推荐
相关产品推荐

