ClientDetailsS​​ervice java 在 AuthorizationServerConfigurerAdapter 之外配置

ClientDetailsService java config outside AuthorizationServerConfigurerAdapter

我正在尝试将所有环境特定的 bean 等分组 classes 并且我在 OAuth2 类型的应用程序中遇到 ClientDetailsS​​ervice 问题。

@Configuration
@EnableAuthorizationServer
protected static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {

  @Autowired
  private UserDetailsService userDetailsService;

  ...

  @Autowired
  private ClientDetailsService clientDetailsService;

  ...

  @Override
  public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
      clients.withClientDetails( clientDetailsService );
  }
}

然后我有一个单独的配置 class 像这样:

@Configuration
@Profile(value={"default"})
public class DevConfiguration {

  ...

  @Bean
  public ClientDetailsService clientDetailsService() {
    return new InMemoryClientDetailsService();
  }

  @Bean
  public UserDetailsService userDetailsService() {
    return new InMemoryUserDetails();
  }

  ...

}

然后我将有一个 ProductionConfiguration class 使用 JDBC 实现等所有这些服务。这个想法是 AuthorizationServerConfiguration 有很多适用于所有环境的东西(令牌增强器、端点配置等)所以我想避免 copy/pasting 所有这些代码。

问题是我的 public ClientDetailsService clientDetailsService() 没有被调用,AuthorizationServerConfiguration 中的 @Autowired clientDetailsService 似乎被代理了,就像它没有找到创建 [=18= 实例的代码一样]. 当应用程序通过 id 加载客户端详细信息时,我最终得到一个 WhosebugError(猜测代理正在调用自己)。

我可以看到其他@Bean 正在从 DevConfiguration 实例化(如 UserDetailsService),因此在配置应用程序时肯定会考虑 class。我也非常想避免使用限定符。

我做错了什么? 从 AuthorizationServerConfigurerAdapter 等到 "externalize" 数据存储等的最佳方法是什么?

感谢您的帮助!

我的 AuthorizationServerConfiguration 实际上在另一个 @Configuration class 里面。 结果是将 AuthorizationServerConfiguration 移动到它自己的文件中解决了问题。