You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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未被正确扫描:

  1. @EnableJpaRepositories未指定basePackages时,默认扫描当前类所在包及其子包,而RoleRepository位于package-route包,不在SecurityConfig的扫描范围内;
  2. 重复添加的@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:04:52