just remove the InjectService annotation from your service 
method and try it again :)




Martin Grotzke <[EMAIL PROTECTED]> 
02.07.2007 16:50
Bitte antworten an
"Tapestry users" <users@tapestry.apache.org>


An
Tapestry users <users@tapestry.apache.org>
Kopie

Thema
Re: Antwort: RE: T5 Decoupling a Template From its Component Class






On Mon, 2007-07-02 at 16:06 +0200, Kristian Marinkovic wrote:
> 
> service implementations contributed to the alias service will 
> override the other service implementations. this is also true for 
> implementations originally provided by tapestry 
> 
> the additional id is to distinguish multiple implementations of the 
> same interface. in your case you should only need it twice: 
> 1) to define your service 
> 2) to contribute to the alias service.... then you can forget it :) 

If I understand you correctly, you say that 

   public static PageResponseRenderer decoratePageResponseRenderer(
           @InjectService("PageMarkupRenderer")
           final PageMarkupRenderer markupRenderer,
           @InjectService("MarkupWriterFactory")
           final MarkupWriterFactory markupWriterFactory,
           final Object delegate )

should provide our custom MarkupWriterFactory?
This is not the fact - with @InjectService("MarkupWriterFactory")
T5 provides its MarkupWriterFactoryImpl and not our custom
MarkupWriterFactory.
Did I understand you wrong, or is this a "bug" in T5?

Cheers,
Martin



> 
> g, 
> kris 
> 
> 
> 
> Martin Grotzke
> <[EMAIL PROTECTED]> 
> 
> 02.07.2007 14:10 
>         Bitte antworten an
>          "Tapestry users"
>     <users@tapestry.apache.org>
> 
> 
> 
> 
>                An
> Tapestry users
> <users@tapestry.apache.org> 
>             Kopie
> 
>             Thema
> RE: T5 Decoupling
> a Template From
> its Component
> Class
> 
> 
> 
> 
> 
> 
> 
> 
> On Mon, 2007-07-02 at 11:03 +0200, Kristian Marinkovic wrote:
> > 
> > hi martin, 
> > 
> > if you use the ServiceBinder to contribute a class that implements
> an
> > already 
> > "contributed" interface you have to assign an id for your class by
> > invoking withId, 
> > because the Interface is no longer sufficient to identifiy the
> service
> > 
> >  binder.bind(PageTemplateLocator.class, 
> >         MyPageTemplateLocatorImpl.class).withId("myLocator"); 
> > 
> > furthermore you have to contribute to the aliasOverrides Service 
> > to actually replace the old implementation: 
> > 
> > public static void contributeAliasOverrides( 
> >             @InjectService("myLocator") PageTemplateLocator
> locator, 
> >             Configuration<AliasContribution> configuration) { 
> > 
> >    configuration.add( 
> >          AliasContribution.create( 
> >                  PageTemplateLocator.class, locator)); 
> 
> Great, this works - thanx a lot!
> 
> Just for clarification: the specified id has to be used anywhere else,
> right? E.g. for us the service in question is the MarkupWriterFactory,
> and previously we also had this in our AppModule:
> 
>    public static PageResponseRenderer decoratePageResponseRenderer(
>            @InjectService("PageMarkupRenderer")
>            final PageMarkupRenderer markupRenderer,
>            @InjectService("MarkupWriterFactory")
>            final MarkupWriterFactory markupWriterFactory,
>            final Object delegate )
> 
> which we have to change to @InjectService("myMarkupWriterFactory")
> then.
> Is this the intended way? Is it guaranteed, that T5 does not reference
> the MarkupWriterFactory implementation by the id
> "MarkupWriterFactory"?
> 
> Thanx && cheers,
> Martin 
> 
> 
> > 
> > 
> > g, 
> > kris 
> > 
> > 
> > 
> > Martin Grotzke
> > <[EMAIL PROTECTED]> 
> > 
> > 02.07.2007 10:00 
> >         Bitte antworten an
> >          "Tapestry users"
> >     <users@tapestry.apache.org>
> > 
> > 
> > 
> > 
> >                An
> > Tapestry users
> > <users@tapestry.apache.org> 
> >             Kopie
> > 
> >             Thema
> > RE: T5 Decoupling
> > a Template From
> > its Component
> > Class
> > 
> > 
> > 
> > 
> > 
> > 
> > 
> > 
> > > Digging through the code I notice there is a PageTemplateLocator
> > > interface which seems like the appropriate service to override.
> What
> > I
> > > have tried is to add the following method to my AppModule
> class....
> > > 
> > > 
> > > public static void bind(ServiceBinder binder) {
> > >   ServiceBindingOptions options = 
> > >                                   binder.bind(
> > >
> >  PageTemplateLocator.class,
> > >
> >  MyPageTemplateLocatorImpl.class
> > >                                                    );
> > > }
> > > 
> > > 
> > > ...but I get the following exception at startup.....
> > > 
> > > 
> > > java.lang.RuntimeException: Service id 'PageTemplateLocator' has
> > already
> > > been defined by
> > 
> > Did you solve this issue? I get the same exception with another
> > Service
> > that's defined in TapestryModule that I want to override in my
> > AppModule
> > with my custom implementation...
> > 
> > Thx && cheers,
> > Martin
> > 
> > 
> > On Wed, 2007-05-30 at 19:17 -0700, David Kendall wrote:
> > > > From: Howard Lewis Ship [mailto:[EMAIL PROTECTED] 
> > > > Sent: Wednesday, May 30, 2007 5:15 PM
> > > > There are internal services that can be overridden to handle
> > those 
> > > > kinds of situations.
> > > > The goal is to create something that works amazingly well for
> all 
> > > > the more typical cases, then start going after these others.
> >  Often 
> > > > it will involve moving a private interface out into the public
> > space
> > > ..
> > > 
> > > 
> > > 
> > > 
> > > Thanks Howard - I appreciate your prompt response.  However - I am
> > not
> > > clear if you are saying it cannot be done currently - or if you
> mean
> > > that it can be done - but that I would be treading on somewhat
> > unstable
> > > ground given that the internal interfaces are subject to change.
> > > 
> > > Digging through the code I notice there is a PageTemplateLocator
> > > interface which seems like the appropriate service to override.
> What
> > I
> > > have tried is to add the following method to my AppModule
> class....
> > > 
> > > 
> > > public static void bind(ServiceBinder binder) {
> > >   ServiceBindingOptions options = 
> > >                                   binder.bind(
> > >
> >  PageTemplateLocator.class,
> > >
> >  MyPageTemplateLocatorImpl.class
> > >                                                    );
> > > }
> > > 
> > > 
> > > ...but I get the following exception at startup.....
> > > 
> > > 
> > > java.lang.RuntimeException: Service id 'PageTemplateLocator' has
> > already
> > > been defined by
> > >
> >
> org.apache.tapestry.internal.services.InternalModule.build(AssetFactory,
> > > ComponentClassResolver) (at InternalModule.java:231) and may not
> be
> > > redefined by
> > > org.example.myapp.services.AppModule$MyPageTemplateLocatorImpl()
> (at
> > > AppModule.java:159). You should rename one of the service builder
> > > methods.
> > > 
> > > 
> > > 
> > > 
> > > Am I wasting my time trying this? I can tolerate a certain amount
> of
> > > instability when pulling in subsequent revisions of Tap5 - however
> -
> > I
> > > would like to get a proof of concept up and running if at all
> > possible.
> > > 
> > > Any thoughts on this?
> > > 
> > > Thanks again.
> > > 
> > > David Kendall
> > > 
> > > 
> > > 
> > >
> >
> ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > For additional commands, e-mail: [EMAIL PROTECTED]
> > > 
> > -- 
> > Martin Grotzke
> > http://www.javakaffee.de/blog/
> > 
> >
> ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> -- 
> Martin Grotzke
> http://www.javakaffee.de/blog/
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
-- 
Martin Grotzke
http://www.javakaffee.de/blog/

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to