我正在尝试将所有特定于环境的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
等中“外部化”数据存储库的最佳方法是什么?谢谢您的帮助!
最佳答案
我的AuthorizationServerConfiguration
实际上在另一个@Configuration
类中。
事实证明,将AuthorizationServerConfiguration
移至其自己的文件可解决此问题。