我在 spring-social 上练习,当我在 Eclipse 中执行“Run as Junit Test”时,似乎 userConnectionRepository 在以下代码中没有正确 Autowiring 。在创建新的 FacebookOffLine 时,我在 usersConnectionRepository 上得到一个空指针异常,尽管在 @Bean java 创建代码中放置的断点显示它们似乎已正确创建。提前致谢,
public class FacebookOffline {
private Facebook fb;
@Autowired
private UsersConnectionRepository usersConnectionRepository;
public FacebookOffline(User user) {
super();
ConnectionRepository cr = usersConnectionRepository.createConnectionRepository(user.getId());
fb = cr.getPrimaryConnection(Facebook.class).getApi();
}
}
这是测试代码:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {
org.springframework.social.quickstart.config.MainConfig.class,
org.springframework.social.quickstart.config.SocialConfig.class })
public class FacebookOfflineTest {
@Test
public void test1() {
FacebookOffline essai = new FacebookOffline(new User("yves"));
以及改编自 Keith Donald Quick Start Sample 的 Spring 配置类:
@Configuration
@ComponentScan(basePackages = "org.springframework.social.quickstart", excludeFilters = { @Filter(Configuration.class) })
@PropertySource("classpath:org/springframework/social/quickstart/config/application.properties")
public class MainConfig {
@Bean
public DataSource datasource() {
DriverManagerDataSource toReturn = new DriverManagerDataSource("jdbc:mysql://localhost:3306/spring_social");
toReturn.setDriverClassName("com.mysql.jdbc.Driver");
toReturn.setUsername("spring");
toReturn.setPassword("spring");
return toReturn;
}
}
@Configuration
public class SocialConfig {
@Inject
private Environment environment;
@Inject
private DataSource dataSource;
@Bean
public ConnectionFactoryLocator connectionFactoryLocator() {
ConnectionFactoryRegistry registry = new ConnectionFactoryRegistry();
registry.addConnectionFactory(new FacebookConnectionFactory(environment
.getProperty("facebook.clientId"), environment
.getProperty("facebook.clientSecret")));
return registry;
}
@Bean
public UsersConnectionRepository usersConnectionRepository() {
JdbcUsersConnectionRepository repository = new JdbcUsersConnectionRepository(
dataSource, connectionFactoryLocator(), Encryptors.noOpText());
return repository;
}
}
最佳答案
其实这里有2个问题。
- Spring 无法 Autowiring 不受其控制的 bean(即使用 new 创建)
- 构造函数中没有依赖关系(在注入(inject)之前需要一个对象实例)
第一个问题可以通过让 spring 管理一个 FacebookOffline 实例来缓解(或者如果您需要多个实例,则使 bean 请求或 session 范围)。
第二个有点难,但可以通过使用带有 @PostConstruct
注释的方法(或通过从 spring 实现 InitializingBean
)来解决。
关于java - @Autowire 未正确注入(inject) Spring @Bean 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18865037/