我正在写一个基于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.internalEventListenerFactory,myCouchbaseConfig,integrationTestConfig,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessor,CBRepoFactory,repoFactoryBuilder,positorBucket,BuildUserBase, ,couchbaseClusterInfo,couchbaseEnv,榻榻米基础翻译服务,榻榻米基础索引管理器,榻榻米基础映射转换器,榻榻米基础模板,榻榻米基础存储操作映射,榻榻米基础映射上下文,榻榻米基础定制公司nversions,org.springframework.data.couchbase.repository.config.CouchbaseRepositoryConfigurationExtension#0,userActivityRepository]
java.lang.NullPointerException
内部数据库客户端。得到计数
谁能告诉我我在做什么错。
最佳答案
经典春季新手错误。我看过一千遍了。
您自动连接了一个类DBClient
,期望Spring将为您处理所有依赖项注入。
然后,通过调用new
实例化自己的实例:
DBClient dbClient = new DBClient();
一旦调用
new
,它将不受Spring的控制。这里没有自动接线,UserActivityRepositoryService
为空。您必须选择:要么让Spring控制所有事情,要么您做。
如果您正在测试,我建议您使用模拟,并将Spring排除在JUnit测试之外。
我还建议您更喜欢使用构造方法注入而不是使用getter / setter方法。这样一来,您就可以在需要的时候(例如在编写单元测试时)在代码中进行操作。
看起来您正在尝试编写数据服务。我建议您不要使用框架,而使用Spring Boot。它已经为您does this。