我有这样的安全配置类
@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 时开始出现的。
您的
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" })
我建议坚持使用第一种方法,因为它在大多数情况下都是开箱即用的。