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