Spring 2升级至3后遭遇UnsatisfiedDependencyException问题求助
Spring 3升级后依赖注入失败问题排查与解决
问题现象
将SecurityConfig从Spring 2升级到Spring 3后,启动Tomcat时触发org.springframework.beans.factory.UnsatisfiedDependencyException:无法创建securityConfig Bean,其依赖的permissionService注入失败;permissionService无法创建的原因是找不到package-route.RoleRepository类型的合格Bean,无法满足自动注入要求。
核心原因
SecurityConfig类上冗余的@ComponentScan和@EnableJpaRepositories注解覆盖了Spring Boot主类的默认扫描配置,导致JPA Repository未被正确扫描:
@EnableJpaRepositories未指定basePackages时,默认扫描当前类所在包及其子包,而RoleRepository位于package-route包,不在SecurityConfig的扫描范围内;- 重复添加的
@ComponentScan会改变Spring的组件扫描范围,可能导致其他必要组件未被加载。
解决方案
1. 移除SecurityConfig上的冗余注解
修改SecurityConfig类,删除@ComponentScan和@EnableJpaRepositories,保留核心注解即可:
@Configuration @EnableWebSecurity public class SecurityConfig { @Value("${cors-allow-origin.url}") private String corsAllowOriginUrl; @Autowired private PermissionService permissionService; @Bean SecurityFilterChain configure(HttpSecurity http) throws Exception { http .authenticationManager(authenticationManager(http)) .httpBasic(basic -> basic.disable()) .csrf(csrf -> csrf.disable()) .sessionManagement(management -> management.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(auth -> { auth .requestMatchers(HttpMethod.GET, "/swagger-ui/**", "/v3/api-docs/**").permitAll(); // 其他URL配置 }); return http.build(); } }
2. 确保Repository被正确扫描
如果RoleRepository所在的package-route包不在主类io.inowise.inox的子包下,需在主类中明确指定扫描范围:
package io.inowise.inox; @SpringBootApplication(scanBasePackages = {"io.inowise.inox", "package-route"}) @EnableJpaRepositories(basePackages = "package-route") @EnableScheduling public class InoxApplication { public static void main(String[] args) { SpringApplication.run(InoxApplication.class, args); } }
若RoleRepository位于主类的子包下,仅移除SecurityConfig的冗余注解即可完成自动扫描。
3. 推荐使用构造器注入(Spring 3最佳实践)
Spring 3推荐使用构造器注入替代字段注入,避免潜在的循环依赖问题,同时提升代码可测试性:
- 修改PermissionService:
@Service @Transactional public class PermissionService { private final RoleRepository roleRepository; public PermissionService(RoleRepository roleRepository) { this.roleRepository = roleRepository; } }
- 修改SecurityConfig:
@Configuration @EnableWebSecurity public class SecurityConfig { private final String corsAllowOriginUrl; private final PermissionService permissionService; public SecurityConfig(@Value("${cors-allow-origin.url}") String corsAllowOriginUrl, PermissionService permissionService) { this.corsAllowOriginUrl = corsAllowOriginUrl; this.permissionService = permissionService; } @Bean SecurityFilterChain configure(HttpSecurity http) throws Exception { // 原有配置不变 return http.build(); } }
内容的提问来源于stack exchange,提问作者Unai
相关产品推荐
相关产品推荐

