Spring UnsatisfiedDependencyException,使用名称创建 bean 时出错

问题描述 投票:0回答:1

我有这样的安全配置类

@Configuration
@EnableWebSecurity
@ComponentScan
@EnableJpaRepositories
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()
//Other urls
                });
        return http.build();
    }

在日志上我有以下内容

| ERROR | TomcatStarter - Error starting Tomcat context. Exception:
 org.springframework.beans.factory.UnsatisfiedDependencyException. 
 Message: Error creating bean with name 'securityConfig': Unsatisfied 
 dependency expressed through field 'permissionService': Error 
 creating
 bean with name 'permissionService': Unsatisfied dependency expressed 
 through field 'roleRepository': No qualifying bean of type 
 'package-route.RoleRepository' available: expected at 
 least 1 bean which qualifies as autowire candidate. Dependency 
 annotations: 
 {@org.springframework.beans.factory.annotation.Autowired(required=true)}

我拥有带有(我相信)正确注释的权限服务

@Service
@Transactional
public class PermissionService {

    @Autowired
    RoleRepository roleRepository;

最后是这样的角色存储库

@Repository
public interface RoleRepository extends JpaRepository<RoleEntity, String> {
    Optional<RoleEntity> findByName(String name);
    Optional<List<RoleEntity>> findAllByPermissions(PermissionEntity permission);


}

所有这些错误都是在将 SecurityConfig 从 Spring 2 更新到 Spring 3 时开始出现的。

spring spring-boot spring-annotations spring-security-config
1个回答
0
投票

您的

SecurityConfig
PermissionService
RoleRepository
分别位于
io.inowise.inox.security
io.inowise.inox.services
io.inowise.inox.repositories

您正在用

@SecurityConfig
注释
@EnableJpaRepositories
。这一事实指示 Spring 在
io.inowise.inox.security
包中查找 Spring Data JPA 存储库,考虑到您的项目结构,这是错误的,因为您的存储库应该位于
io.inowise.inox.repositories

来自

@EnableJpaRepositories
javadoc

启用 JPA 存储库的注释。默认情况下会扫描 Spring Data 存储库的带注释的配置类的包。

您有一些选择来解决此问题:

一个解决方案:最常见的可能是使用 Spring Boot 及其开箱即用的自动配置。

如果您的项目中有

spring-boot-starter-data-jpa
依赖项,它将带来 Spring Data JPA Repositories 的自动配置类,您无需执行任何其他操作。只需从
@EnableJpaRepositories
类中删除
SecurityConfig
即可。这适用于大多数项目。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

另一个解决方案是告诉

@EnableJpaRepository
注释您要扫描存储库的基础包:

@EnableJpaRepositories(basePackages = { "io.inowise.inox.repositories" })

我建议坚持使用第一种方法,因为它在大多数情况下都是开箱即用的。

© www.soinside.com 2019 - 2024. All rights reserved.