Spring自动装配无法正常工作

时间:2017-08-17 20:37:20

标签: java spring annotations

我正在编写一个基于Java Spring的库。我为他们写了junit测试。我遇到的问题是,虽然我的豆子正在打印,但它们没有正确地自动装配。它们是空的。

这是代码。

@Test
public void test() {
    System.out.println(Arrays.asList(applicationContext.getBeanDefinitionNames()));

    try{
    DBClient dbClient = new DBClient();
    dbClient.doSomething();
    }catch(Exception e){
        e.printStackTrace();
    }
}

这是我的DBClient代码:

    @Autowired
@Qualifier("UserActivityRepositoryService")
private UserActivityRepositoryService userRepositoryService;

public void doSomething() {
    System.out.println("Inside db client. Getting the count");
    System.out.println(this.userRepositoryService.count());
}

这是我的UserRepositoryService类代码

@Service
@Qualifier("UserActivityRepositoryService")
public class UserActivityRepositoryService implements IRepoClient<UserActivity>{

private UserActivityRepository repo;

@Autowired
public void setUserActivityRepository(UserActivityRepository repo) {
    this.repo = repo;
}

public void create(UserActivity userActivity) {
    repo.save(userActivity);        

}

@Override
public UserActivity save(UserActivity entity) {
    // TODO Auto-generated method stub
    System.out.println("Creating the documenht");
    try{
    repo.save(entity);
    }catch(Exception e){
        e.printStackTrace();
    }
    System.out.println("userActivity" + entity);
    return null;
}

@Override
public Iterable<UserActivity> save(Iterable<UserActivity> entities) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public UserActivity findOne(String id) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public boolean exists(String id) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public Iterable<UserActivity> findAll() {
    // TODO Auto-generated method stub
    return null;
}

@Override
public Iterable<UserActivity> findAll(Iterable<String> ids) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void delete(String id) {
    // TODO Auto-generated method stub

}

@Override
public void delete(UserActivity entity) {
    // TODO Auto-generated method stub

}

@Override
public void delete(Iterable<? extends UserActivity> entities) {
    // TODO Auto-generated method stub

}

@Override
public void deleteAll() {
    // TODO Auto-generated method stub

}

@Override
public long count() {
    // TODO Auto-generated method stub
    return 0;
}
}

这是我的输出: [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.event.internalEventListenerProcessor ,org.springframework.context.event.internalEventListenerFactory,myCouchbaseConfig,integrationTestConfig,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessor,CBRepoFactory,repoFactoryBuilder,config,userActivityRepositoryService,couchbaseBucket,couchbaseCluster ,couchbaseClusterInfo,couchbaseEnv,couchbaseTranslationService,couchbaseIndexManager,couchbaseMappingConverter,couchbaseTemplate,couchbaseRepositoryOperationsMapping,couchbaseMappingContext,couchbaseCustomCo nversions,org.springframework.data.couchbase.repository.config.CouchbaseRepositoryConfigurationExtension#0,userActivityRepository] 显示java.lang.NullPointerException 在db客户端内部。获得点数

谁能告诉我我做错了什么。

2 个答案:

答案 0 :(得分:3)

Classic Spring新手的错误。我已经看过一千次了。

你自动安装了一个类DBClient,期望Spring会为你处理所有的依赖注入。

然后通过调用new来实例化您自己的实例:

DBClient dbClient = new DBClient();

致电new后,它已经超出了Spring的控制范围。这里没有自动接线,UserActivityRepositoryService为空。

你必须选择:让Spring控制一切,或者你做。

如果您正在测试,我建议您使用模拟并将Spring从JUnit测试中删除。

我还建议您更喜欢构造函数注入getter / setter。这样你就可以在需要的时候在代码中完成它,就像你在编写单元测试一样。

您似乎正在尝试编写数据服务。我建议你忘记你的框架并使用Spring Boot。它已经does this了。

答案 1 :(得分:0)

你需要改变你的测试(就像duffymo已经说过的那样):

@Autowired
private DBClient dbClient;   

@Test
public void test() {
    System.out.println(Arrays.asList(applicationContext.getBeanDefinitionNames()));

    try{
        dbClient.doSomething();
    }catch(Exception e){
        e.printStackTrace();
    }
}