surya
surya

Reputation: 189

Spring autowiring not working properly

I am writing a Java Spring based Library. I have written junit tests for them. The problem which I have is that though my beans are getting printed, they are not getting autowired properly. They are null.

Here is the code.

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

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

Here is my DBClient code:

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

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

This is my UserRepositoryService class code

@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;
}
}

Here is my output: [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, couchbaseCustomConversions, org.springframework.data.couchbase.repository.config.CouchbaseRepositoryConfigurationExtension#0, userActivityRepository] java.lang.NullPointerException Inside db client. Getting the count

Can anyone tell me what I am doing wrong.

Upvotes: 0

Views: 427

Answers (2)

flexguse
flexguse

Reputation: 479

You need to change your test like this (as duffymo already said):

@Autowired
private DBClient dbClient;   

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

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

Upvotes: 0

duffymo
duffymo

Reputation: 308743

Classic Spring newbie mistake. I've seen it a thousand times.

You autowired a class DBClient, expecting that Spring will handle all the dependency injection for you.

Then you instantiate your own instance by calling new:

DBClient dbClient = new DBClient();

Once you call new, it's out of Spring's control. There is no auto wiring going on here, UserActivityRepositoryService is null.

You have to choose: Either give Spring control of everything or you do it.

If you're testing, I'd recommend using mocks and leaving Spring out of your JUnit testing.

I'd also recommend that you prefer constructor injection over getter/setter. That way you can do it in code when you need to, like when you're writing unit tests.

Looks like you're trying to write a data service. I'd recommend that you forget about your framework and use Spring Boot. It already does this for you.

Upvotes: 3

Related Questions