I reduced ExternalDataSourceModule down to this:
protected void configure()
{
bind(FooBar.class).to(FooBarImpl.class);
}
and reduced PushServletModule down to this:
protected void configureServlets()
{
/* bind the REST resources */
bind(ItemResource.class);
/* bind jackson converters for JAXB/JSON serialization */
bind(MessageBodyReader.class).to(JacksonJsonProvider.class);
bind(MessageBodyWriter.class).to(JacksonJsonProvider.class);
Map<String, String> initParams = new HashMap<String, String>();
initParams.put("com.sun.jersey.config.feature.Trace", "true");
initParams.put("com.sun.jersey.config.property.packages",
"com.warren.pushlocal.rest.resources");
serve("*").with(GuiceContainer.class, initParams);
}
I am injecting FooBar into ItemResource. I get the same type of error
message: "It was already configured on one or more child
injectors or private modules".
I reduce it down further by replacing bind(ItemResource.class) with
bind(Foo.class) and I inject FooBar into Foo and I get no errors.
I am using guice to configure/manage jersey, so I am guessing
something is going on under the covers in jersey that does not like
having a resource injected when it is configured in a child injector,
or as you said:
"you force bindings sooner than they would be in a normal binding
context"
But, you mentioned that if I use a single injector that I would "move
the problem that would be exposed later in the single-injector case to
injector-creation time". When I use a single injector, the injection I
make into ItemResource works fine.
I guess the bottom line is that Jersey REST resources should be
configured in a single or parent injector and not a child injector ?
If that is the case, then I will create a new post that addresses the
reason why I was using a child injector in the first place.
Any insight would be appreciated.
Thanks,
Warren
On Mar 13, 5:11 am, Christian Edward Gruber <[email protected]>
wrote:
> Can you replicate this with extremely minimalist ExternalDataSourceModule()
> and PushServletModule()s? The devil's in the details here. What is being
> bound may have an impact.
>
> One thing worth noting is that, as I recall, when you createChildInjector()
> you force bindings sooner than they would be in a normal binding context - I
> believe this is to resolve things in the parent so they can be available to
> the chile. However, this can move the problem that would be exposed later in
> the single-injector case to injector-creation time, which may be why these
> look different. If you could empty out these modules until you have versions
> that both invoke this problem and you can post, that would help, since then
> we can see what's actually going wrong in the bindings.
>
> Christian.
>
> On Mar 13, 2012, at 1:04 AM, Warren wrote:
>
>
>
>
>
>
>
> > I have implemented GuiceServletContextListener like this:
>
> > @Override
> > protected Injector getInjector()
> > {
> > Injector parentInjector = Guice.createInjector(new AbstractModule()
> > {
>
> > @Override
> > protected void configure()
> > {
> > // for troubleshooting this issue I have left
> > this blank, normally other
> > // bindings would be bound here that
> > ExternalDataSourcesModule depends on
> > }
>
> > });
> > Injector childInjector = parentInjector.createChildInjector(new
> > ExternalDataSourcesModule(), new PushServletModule());
> > return childInjector;
> > }
>
> > I get the following exception message:
>
> > SEVERE: Exception starting filter GuiceFilter
> > com.google.inject.ConfigurationException: Guice configuration errors:
>
> > 1) Unable to create binding for java.util.Map<java.lang.String,
> > c.w.p.s.ItemService>. It was already configured on one or more child
> > injectors or private modules
> > bound at
> > c.w.p.s.ExternalDataSourcesModule.configure(ExternalDataSourcesModule.java:
> > 53)
> > If it was in a PrivateModule, did you forget to expose the binding?
> > while locating java.util.Map<java.lang.String, c.w.p.s.ItemService>
> > for field at c.w.p.s.ItemResource.itemServices(ItemResource.java:
> > 23)
> > while locating c.w.p.s.ItemResource
>
> > When I Implement getInjector() like this, I get no errors and
> > everything works.
>
> > @Override
> > protected Injector getInjector()
> > {
> > return Guice.createInjector(new ExternalDataSourcesModule(), new
> > MyServletModule());
> > }
>
> > No other code has changed other than the getInjector() method.
> > ExternalDataSourcesModule and MyServletModule are identical in both
> > implementations of getInjector(). And in the child injector scenario,
> > the parent injector has not bound anything.
>
> > Why do I get the Guice configuration errors when I configure using a
> > child injector and I don't when I configure with only the main
> > injector?
>
> > Thanks,
>
> > Warren Bell
>
> > --
> > 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
> > athttp://groups.google.com/group/google-guice?hl=en.
--
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.