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 [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-guice?hl=en.

Reply via email to