Howard:

Thanks for your answer, but I sure don't see where we're injecting by
the type, but that may just mean I need to look harder. Maybe somewhere
we're providing a builder or something.

But just for clarification, you're saying that I should NOT need to do the
ContributeAlias bit to resolve the bind().withId("one") if all the Tapestry
injections
of the service are annotated wtih @InjectService("one")?

I guess my next step is to see just how much stuff I can remove before
things
"just work". If I get it back to what looks like a test program I'll let you
know.

Thanks
Erick



On Mon, May 24, 2010 at 3:06 PM, Howard Lewis Ship <hls...@gmail.com> wrote:

> You should only be getting this error:
>
> Service interface  CommonInterface is matched by 2 services: one, two.
> Automatic dependency resolution requires that exactly one service implement
> the interface.
>
>
> if you are injecting somewhere by type (CommonInterface) rather than
> service id.  The console log will tell you exactly how Tapestry got to
> that point.
>
> On Mon, May 24, 2010 at 11:32 AM, Shing Hing Man <mat...@yahoo.com> wrote:
> > I think you need the Marker annotations.
> > Please check it out at the link below.
> >
> > http://tapestry.apache.org/tapestry5.1/tapestry-ioc/service.html
> >
> >
> >
> > Shing
> >
> > --- On Tue, 25/5/10, Erick Erickson <erickerick...@gmail.com> wrote:
> >
> >> From: Erick Erickson <erickerick...@gmail.com>
> >> Subject: Problems with @InjectService
> >> To: "Tapestry users" <users@tapestry.apache.org>
> >> Date: Tuesday, 25 May, 2010, 1:58
> >> I've seen several iterations of this
> >> problem in the users list, but the
> >> solution still eludes me.
> >>
> >> This is the very basic issue of having two different
> >> concrete realizations
> >> of a particular interface and wanting to have a service for
> >> each concrete
> >> implementation in a Tapestry 1.5.0.5 environment.
> >>
> >> The binding looks like this:
> >>
> >>
> >> binder.bind(CommonInterface.class,
> >> Concrete1.class).withId("one");
> >>
> >> binder.bind(CommonInterface.class,
> >> Concrete2.class).withId("two");
> >>
> >> And in various components, something like
> >> @InjectService("one")
> >> private CommonInterface concrete1;
> >>
> >> or
> >> @InjectService("two")
> >> private CommonInterface concrete2;
> >>
> >> But now I get errors like:
> >> Service interface  CommonInterface is matched by 2
> >> services: one, two.
> >> Automatic dependency resolution requires that exactly one
> >> service implement
> >> the interface.
> >>
> >> OK, poking around I found things about ContributeAlias, and
> >> this example:
> >> public static void contributeAlias(
> >> @InjectService("one") Concrete1 concrete1
> >> Configuration<AliasContribution> configuration)
> >> {
> >> configuration.add(AliasContribution.create(CommonInterface.class,
> >> concrete1));
> >> }
> >>
> >> and similarly for Concrete2. But now I get errors like:
> >> Caused by: java.lang.RuntimeException: Exception
> >> constructing service
> >> 'Alias': Error invoking service builder method
> >> org.apache.tapestry5.services.TapestryModule.buildAlias(Logger,
> >> String,
> >> AliasManager, Collection) (at TapestryModule.java:325)....
> >>
> >>             Service 'one'
> >> implements interface
> >> CommonInterface, which is not compatible with the requested
> >> type
> >> 'concrete1'.
> >> at
> >>
> org.apache.tapestry5.ioc.internal.services.JustInTimeObjectCreator.obtainObjectFromCreator(JustInTimeObjectCreator.java:78)
> >> at
> >>
> org.apache.tapestry5.ioc.internal.services.JustInTimeObjectCreator.createObject(JustInTimeObjectCreator.java:57)
> >>
> >>
> >> I've severely clipped out extra stuff from the output, I'll
> >> be glad to
> >> provide more details but I suspect this is fairly trivial
> >> to fix if you know
> >> the magic, unfortunately I'm an apprentice...
> >>
> >> I don't understand when adding ContributeAlias is
> >> necessary, it seems to me
> >> that just the "withId" should be sufficient but what do I
> >> know?
> >>
> >> Thanks
> >> Erick
> >>
> >
> >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
> > For additional commands, e-mail: users-h...@tapestry.apache.org
> >
> >
>
>
>
> --
> Howard M. Lewis Ship
>
> Creator of Apache Tapestry
>
> The source for Tapestry training, mentoring and support. Contact me to
> learn how I can get you up and productive in Tapestry fast!
>
> (971) 678-5210
> http://howardlewisship.com
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
> For additional commands, e-mail: users-h...@tapestry.apache.org
>
>

Reply via email to