我正在尝试将所有特定于环境的Bean等归类到几个类中,并且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 );
  }
}


然后,我有一个单独的配置类,如下所示:

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

  ...

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

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

  ...

}


然后,我将使用JDBC实现以及所有这些服务的ProductionConfiguration类。这个想法是AuthorizationServerConfiguration有很多适用于所有环境的东西(令牌增强器,端点配置等),因此我想避免复制/粘贴所有这些代码。

问题是我的public ClientDetailsService clientDetailsService()没有被调用,并且@Autowired clientDetailsService中的AuthorizationServerConfiguration似乎被代理了,就像没有找到创建ClientDetailsService实例的代码一样。
当应用程序该按ID加载客户端详细信息时,我会得到一个StackOverflowError(猜测代理正在调用自身)。

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

我究竟做错了什么?
AuthorizationServerConfigurerAdapter等中“外部化”数据存储库的最佳方法是什么?

谢谢您的帮助!

最佳答案

我的AuthorizationServerConfiguration实际上在另一个@Configuration类中。
事实证明,将AuthorizationServerConfiguration移至其自己的文件可解决此问题。

08-07 05:56