问题描述
我正在覆盖Spring Social Twitter和Facebook的默认Spring Boot配置。 运行应用程序时出现以下错误。
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'connectionFactoryLocator' defined in class path resource [org/springframework/social/config/annotation/SocialConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.social.connect.ConnectionFactoryLocator]: Factory method 'connectionFactoryLocator' threw exception; nested exception is java.lang.IllegalArgumentException: A ConnectionFactory for provider 'twitter' has' already been registered
我有一种感觉,这种情况正在发生,因为与默认配置存在一些冲突。 代码如下,我该如何解决这个问题?
SocialConfig
@Configuration
@EnableSocial
public class SocialConfig implements SocialConfigurer{
protected static final String FACEBOOK_APP_ID = "spring.social.facebook.appId";
protected static final String FACEBOOK_APP_SECRET = "spring.social.facebook.appSecret";
protected static final String TWITTER_APP_ID = "spring.social.twitter.appId";
protected static final String TWITTER_APP_SECRET = "spring.social.twitter.appSecret";
private DataSource dataSource;
@Inject
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
@Override
public void addConnectionFactories(ConnectionFactoryConfigurer connectionFactoryConfigurer,Environment env) {
connectionFactoryConfigurer.addConnectionFactory(getFacebookConnectionFactory(env));
connectionFactoryConfigurer.addConnectionFactory(getTwitterConnectionFactory(env));
}
@Override
public UserIdSource getUserIdSource() {
return new AuthenticationNameUserIdSource();
}
@Override
public UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) {
return new JdbcUsersConnectionRepository(dataSource, connectionFactoryLocator, Encryptors.noOpText());
}
protected final FacebookConnectionFactory getFacebookConnectionFactory(Environment env) {
String appId = env.getProperty(FACEBOOK_APP_ID);
String appSecret = env.getProperty(FACEBOOK_APP_SECRET);
if(appId == null || appId.isEmpty())
throw new ApplicationPropertyException();
if (appSecret == null || appSecret.isEmpty())
throw new ApplicationPropertyException();
return new FacebookConnectionFactory(appId, appSecret);
}
protected final TwitterConnectionFactory getTwitterConnectionFactory (Environment env){
String consumerKey = env.getProperty(TWITTER_APP_ID);
String consumerSecret = env.getProperty(TWITTER_APP_SECRET);
if(consumerKey == null || consumerKey.isEmpty())
throw new ApplicationPropertyException();
if (consumerSecret == null || consumerSecret.isEmpty())
throw new ApplicationPropertyException();
return new TwitterConnectionFactory(consumerKey, consumerSecret);
}
protected DataSource getDataSource() {
return dataSource;
}
}
AppConfig中
@EnableAutoConfiguration
@ComponentScan
@SpringBootApplication
public class AppConfig{
public static void main(String[] args) {
SpringApplication.run(AppConfig.class, args);
}
}
1楼
Spring Boot的Spring社交Twitter和Spring Social Facebook的自动配置将根据application.properties
的配置自动添加连接工厂。
这些自动配置的连接工厂与您尝试添加的工厂发生冲突。
您尝试添加的配置与Spring Boot为您创建的配置相同。
我建议删除你的配置,让Boot做它的事情。
更改SocialConfig
以扩展SocialConfigurerAdapter
而不是实现SocialConfigurer
然后删除addConnectionFactories
方法。