Search code examples
javaguiceguice-3

Guice -How to inject dependency inside the class which is extending Abstract module - Java


I have to trigger TestDriver.startPoller() from EnvironmentModule since EnvironmentModule is extending from Abstractmodule I am not sure how to inject dependency inside EnvironmentModule is it even possible ?. If not how do I trigger TestDriver.startPoller() from EnvironmentModule

@Log4j2
@AllArgsConstructor(onConstructor = @__(@Inject))
public class TestDriver {

    private ClientTrafficCalculator clientTrafficCalculator;
    private TaskAllocator taskAllocator;


    @SneakyThrows
    public void startPoller() {


        new Thread(clientTrafficCalculator::prepareRateLimiterForAllClients).start();
        new Thread(taskAllocator::processPendingRecordsInDDB).start();
        log.info("All threads are started");

    }

}

Environment module

    @Log4j2
    @AllArgsConstructor(onConstructor = @__(@Inject))
    public class EnvironmentModule extends AbstractModule {
    
        private TestDriver testDriver;
    
    
        @SneakyThrows
        public EnvironmentModule(final String[] args) {
    
            marketplace = System.getProperty("realm", "USTest");
            final String realm = getPropOrDefault("realm", "USTest");
            final String root = getPropOrDefault("root", ".");
            AppConfig.initialize(SERVICE_NAME, null, appConfigArgs);

            TestDriver.startPoller(); 
    
        }

    @Override
    public void configure() {
        install(new TomcatContainerModule(new ServiceModule(Test)));
    }
}

Expected :

TestDriver.startPoller(); // this works fine

Current result

TestDriver.startPoller(); // thorwing null pointer exception because it is not getting injected and TestDriver is null


Solution

  • I guess I found an answer we can do something as below

    @Log4j2
    public class TestDriver extends AbstractModule {
    
    
        @Override
        public void configure() {
            requestInjection(this);
        }
    
        @Inject
        public void startPoller(ClientTrafficCalculator clientTrafficCalculator,
            TaskAllocator taskAllocator, PManager pManager) {
    
            new Thread(pManager::name).start();
          
        }
    
    
    }
    

    And we have to install that, installing will trigger that method

    install(new TestDriver()); //trigger pollers for proxy and task allocation
    

    Thanks Jk