I have a Jersey resource with a facade object injected. This is configured in my ResourceConfig
and the facade gets injected fine. The facade contains a DAO class which also should be injected and is configured in the same ResourceConfig
. Now to my problem; the DAO class is null. Thus, not injected.
@ApplicationPath("/service")
public class SystemSetup extends ResourceConfig {
public SystemSetup() {
packages(false, "com.foo.bar");
packages("org.glassfish.jersey.jackson");
register(JacksonFeature.class);
final LockManager manager = getLockManager();
final SessionFactory sessionFactory = getSessionFactory();
register(new AbstractBinder() {
@Override
protected void configure() {
bindFactory(InjectFactory.getDaoFactory(sessionFactory)).to(Dao.class).in(Singleton.class);
bindFactory(InjectFactory.getFacadeFactory(manager)).to(Facade.class).in(Singleton.class);
}
});
}
@Path("/")
@Produces("text/json")
public class ViewResource {
@Inject
private Facade logic;
public class Facade {
@Inject
private Dao dao; //Not injected
The factory instances are rather simple. They simply call the constructor and pass the argument to it.
The strange thing is that this worked absolut fine when I used bind(Class object) rather than bindFactory.
EDIT
Factories
class InjectFactory {
static Factory<Dao> getDaoFactory() {
return new Factory<Dao>() {
@Override
public Dao provide() {
return new Dao(new Object());
}
@Override
public void dispose(Dao dao) {}
};
}
static Factory<Facade> getFacadeFactory() {
return new Factory<Facade>() {
@Override
public Facade provide() {
return new Facade();
}
@Override
public void dispose(Facade facade) {}
};
}
}
As is the case with most Di frameworks, when you start instantiating things yourself, it's often the case that you are kicking the framework out of the equation. This holds true for the
Factory
instances, as well as the objects the factory creates. So theFacade
instance never gets touch by the framework, except to inject it into the resource class.You can can a hold of the
ServiceLocator
, and explicitly inject objects yourself if you want to create them yourself. Here are a couple options.1) Inject the
ServiceLocator
into theFactory
instance, then inject theFacade
instance.2) Or bind a
Factory
class, and let the framework inject theServiceLocator