Hi!
I've faced the following problem.
I am using Guice within OSGI (though I'm not sure if it is relevant to
the problem itself).
I have one bundle - Persister, within it I configure Guice and then
inject members like this:
Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
install(PersistenceModule.create("SOME_PERSISTENCE_UNIT"));
}
}).injectMembers(this);
PersistenceModule.create() initializes a module for warp-persist and
returns it. Actually, this code works just fine - everything gets
injected correctly.
This bundle then exports this guice-initialized object as an OSGI
service ("Persister").
Another bundle (Client) uses this service. First it is passed with a
"Persister" service instance:
protected void setPersister(Persister persister) {
this.persister = persister;
}
This works fine as well. After that the Client is activated:
protected void activate(ComponentContext context) {
Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(Persister.class).toInstance(this.persister); //
this.persister is initialized earlier by the setter method mentioned
above
}
}).injectMembers(this);
}
injectMembers() initialized needed fields, and some of them in turn
have fields like this:
@Inject
private Persister persister;
I expected that those fields would just be set according to the
"bind(Persister.class).toInstance(this.persister)" configuration
instruction. But instead I get exceptions like the following:
1) No implementation for javax.persistence.EntityManager was bound.
while locating
com.google.inject.Provider<javax.persistence.EntityManager>
for field at persister.impl.RequestDAO.em(RequestDAO.java:15)
while locating persister.impl.RequestDAO
for field at
persister.impl.PersisterComponent.requestDAO(PersisterComponent.java:
42)
at client.ClientComponent$1.configure(ClientComponent.java:47)
2) No implementation for javax.persistence.EntityManager was bound.
while locating
com.google.inject.Provider<javax.persistence.EntityManager>
for field at persister.impl.ResponseDAO.em(ResponseDAO.java:15)
while locating persister.impl.ResponseDAO
for field at
persister.impl.PersisterComponent.responseDAO(PersisterComponent.java:
41)
at client.ClientComponent$1.configure
2 errors
at
com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:
354)
at
com.google.inject.InjectorBuilder.initializeStatically(InjectorBuilder.java:
152)
at com.google.inject.InjectorBuilder.build(InjectorBuilder.java:105)
at com.google.inject.Guice.createInjector(Guice.java:92)
at com.google.inject.Guice.createInjector(Guice.java:69)
at com.google.inject.Guice.createInjector(Guice.java:59)
at client.ClientComponent.activate
... 36 more
I can't figure out what Guice is trying to do. Why would it need
bindings for EntityManager which is only referenced by objects that
are already successfully built before (using a different module)?
P.S. I'll try to summarize the above:
[Persister bundle]: configure-guice, inject members, export built
object as a service (works fine)
[Client bundle]: consume the above service, save it to a field (ok),
configure guice and bind Persister.class to that object, create an
injector - fails
--
You received this message because you are subscribed to the Google Groups "google-guice" group.
To post to this group, send email to
google...@googlegroups.com.
To unsubscribe from this group, send email to
google-guice...@googlegroups.com.
For more options, visit this group at
http://groups.google.com/group/google-guice?hl=en.