Hi, The problem you encountered is caused by attempting to pass "Map<String, URL> configuration" to the contribute method. Unfortunately, as far as I know, Tapestry does not provide an easy way to access to a service configuration from its decorators or overrides.
The simplest solution in your case can be to avoid using contributed mapping and hard-code any mappings from DTDs to resources in your class. You can copy any existing mappings from org.apache.tapestry5.modules.TapestryModule#contributeTemplateParser() if you want. On the other hand, if you really need to use actual contributions to TemplateParser, it is possible to do that via ServiceConfigurationListenerHub: private Map rememberedConfiguration; @Contribute(ServiceConfigurationListenerHub.class) public void addListenerForTemplateParser(OrderedConfiguration<ServiceConfigurationListener> configuration) { configuration.add("trackTemplateParser", new ServiceConfigurationListener() { @Override public void onOrderedConfiguration(final ServiceDef serviceDef, final List configuration) { // nothing } @Override public void onUnorderedConfiguration(final ServiceDef serviceDef, final Collection configuration) { // nothing } @Override public void onMappedConfiguration(final ServiceDef serviceDef, final Map configuration) { if (serviceDef.getServiceId().equalsIgnoreCase("TemplateParser")) { rememberedConfiguration = configuration; } } }); } @Decorate(serviceInterface = TemplateParser.class) public TemplateParser replaceTemplateParser( @Symbol(SymbolConstants.COMPRESS_WHITESPACE) boolean defaultCompressWhitespace, OperationTracker tracker ) { if (rememberedConfiguration == null) { throw new NullPointerException("Missing TemplateParser configuration"); } return new MspTemplateParser(rememberedConfiguration, defaultCompressWhitespace, tracker); } Note: instead using a service override, I need to use a decorator to trigger creation of the default TemplateParser so its configuration can be observed by the listener. If there is a simpler solution, I would be happy to know :-) Best regards, Cezary On Thu, Apr 25, 2019 at 3:14 PM Ric 2000 <erich.gorma...@gmail.com> wrote: > Hi, > here is the stacktrace: > > Caused by: java.lang.IllegalStateException: Construction of service > 'ServiceOverride' has failed due to recursion: the service depends on > itself in some way. Please check > org.apache.tapestry5.ioc.internal.services.ServiceOverrideImpl(Map) (at > ServiceOverrideImpl.java:31) via > org.apache.tapestry5.ioc.modules.TapestryIOCModule.bind(ServiceBinder) (at > TapestryIOCModule.java:52) for references to another service that is itself > dependent on service 'ServiceOverride'. > > at > > org.apache.tapestry5.ioc.internal.RecursiveServiceCreationCheckWrapper.createObject(RecursiveServiceCreationCheckWrapper.java:53) > > at > > org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator$1.invoke(OperationTrackingObjectCreator.java:47) > > at > > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:82) > > And this my override method in my filter module: > > @Contribute(ServiceOverride.class) > > public void contributeAliasOverrides(MappedConfiguration<Class<?>, > Object> serviceOverrides, Map<String, URL> configuration, > > @Symbol(SymbolConstants.COMPRESS_WHITESPACE) boolean > defaultCompressWhitespace, OperationTracker tracker) { > > > > serviceOverrides.add(TemplateParser.class, > > new MspTemplateParser(configuration, > defaultCompressWhitespace, tracker)); > > } > > Regards, Eric > > On Wednesday, April 24, 2019, Mats Andersson <mats.anders...@ronsoft.se> > wrote: > > Hi Eric, > > > > What is the error you are getting? You should be able to either override > or decorate the internal service. I guess it could be a problem with your > implementation of the service, but hard to say without knowing. > > > > Kind Regards > > Mats > > > > On 2019-04-24 11:59, Ric 2000 wrote: > >> > >> Hi all, > >> > >> I'am new to that list, but not to Tapestry :-) > >> > >> Nevertheless I face problems to override one of the Tapestry 5.4.3 > internal > >> services, the TemplateParser. > >> > >> The normal overriding with mapped config and override annotation leads > to > >> errors. > >> > >> Background is, that I want to use a customized SaxTemplateParser in > order > >> to use an own namespace. > >> This is to be able to hide the Tapestry version info in the xsd > declaration > >> of our tml files. > >> > >> Can give me advice how to do it correctly? > >> > >> Thanks in advance. > >> > >> Kind Regards, Eric > >> > > -- > > ---------------------- Mats Andersson | Ronsoft AB | +46(0)73 368 79 82 > > > > >