我正在尝试将所有特定于环境的bean分组在几个类中,而我在OAuth2类型的应用程序中遇到ClientDetailsService问题。
@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
之类的“外部化”数据存储等的最佳方法是什么?
感谢您的帮助!
答案 0 :(得分:0)
我的AuthorizationServerConfiguration
实际上在另一个@Configuration
课程中。
原来,将AuthorizationServerConfiguration
移动到自己的文件解决了这个问题。