Spring 从外部 jar 注入接口

Spring interface injection from external jar

我在外部库中有 spring API 基于身份验证 类,

以下是外部库中的一些类,

package com.security;
import org.springframework.security.authentication.AuthenticationProvider;
@Component
public class ApiKeyAuthenticationProvider implements AuthenticationProvider {

  private static final Logger LOGGER = LoggerFactory.getLogger(ApiKeyAuthenticationProvider.class);

  private ApiAuthCredentialsConfig apiAuthCredentialsConfig;

  public ApiKeyAuthenticationProvider(ApiAuthCredentialsConfig apiAuthCredentialsConfig) {
    this.apiAuthCredentialsConfig = apiAuthCredentialsConfig;
  }
}

ApiAuthCredentialsConfig:

package com.security;
public interface ApiAuthCredentialsConfig {
    String getAuthToken();

    String getAuthTokenHeaderName();
}

并且在 repo 中我添加了上述外部库作为 gradle 依赖项。

我在实际回购中有以下变化。

@Component
@Data
public class ApiAuthenticationConfig implements ApiAuthCredentialsConfig {
    @Value("${auth-token}")
    private String authToken;
    @Value("${auth-token-header-name}")
    private String authTokenHeaderName;
}

安全配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private ApiKeyAuthenticationProvider apiKeyAuthenticationProvider;

@Override
public void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.
antMatcher("/**").
csrf().disable().
sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).
and().addFilterBefore(new ApiKeyAuthenticationFilter(authenticationManager(), apiKeyAuthenticationProvider.getHeaderName()), AnonymousAuthenticationFilter.class)
.authorizeRequests().anyRequest().authenticated();
}

@Bean
public AuthenticationManager authenticationManager() {
return new ProviderManager(Collections.singletonList(apiKeyAuthenticationProvider));
}
}

申请:

@SpringBootApplication(scanBasePackages = {"com.security"})
@EnableSwagger2
public class Application {

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}
}

当我 运行 应用程序失败并出现以下错误时

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in com.security.ApiKeyAuthenticationProvider required a bean of type 'com.security.ApiAuthCredentialsConfig' that could not be found.

如何解决这个问题?

在上面的评论之后,我意识到 ApiAuthenticationConfigApiAuthCredentialsConfig 不在同一个包中,在我将 ApiAuthenticationConfig 移动到 com.security 包后它开始工作了。