You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Muhammad Gelbana <m....@gmail.com> on 2012/09/08 14:51:58 UTC

[t.5.3.4] Couldn't use a symbol-dependant SymbolProvider

So the docs are saying that symbols are first resolved by the
ApplicationDefaults symbols provider and then consequent symbols providers
if the symbols wasn't first resolved by the ApplicationDefaults symbol
provider.

I have a main application with multiple modules among which is a core
module contributing a custom symbol provider that, it self, needs symbols
to be resolved to operate.

Here is a portion of my SymbolProvider service

> public class ConfigurationSourceImpl {
> @Inject
> @Symbol(IpkSymbols.CONFIG_TABLE_NAME)
> private String tableName;
> @Inject
> @Symbol(IpkSymbols.CONFIG_TABLE_KEY_COLUMN)
> private String keyColumn;
> @Inject
> @Symbol(IpkSymbols.CONFIG_TABLE_VALUE_COLUMN)
> private String valueColumn;


.. and my module class

> @Startup
> *public void init(@InjectService("IpkConfig") IConfigurationSource
> config) {
> config.startMonitor();
> }*
> public static void bind(ServiceBinder binder) {
> binder.bind(IConfigurationsDAO.class, ConfigurationsDAOImpl.class);
> * binder.bind(IConfigurationSource.class,
> ConfigurationSourceImpl.class).withId("IpkConfig");*
> }
> *@Contribute(SymbolSource.class)
> public void
> injectIpKaizensConfigurationSoruce(OrderedConfiguration<SymbolProvider>
> providers,
> @InjectService("IpkConfig") IConfigurationSource ipkConfigSrc) {
> providers.add("IpKaizen-DB-Configuration-Provider", ipkConfigSrc);
> }*
> public PersistenceManagerFactory buildIpKaizenPMF(*@Inject
> @Symbol(IpkSymbols.DB_IPK) String filePath*, Logger log) {
> ...
> }
> public void *contributeApplicationDefaults*(MappedConfiguration<String,
> String> configuration) {
> configuration.add(IpkSymbols.CONFIG_TABLE_NAME, "configurations");
> configuration.add(IpkSymbols.CONFIG_TABLE_KEY_COLUMN, "key");
> configuration.add(IpkSymbols.CONFIG_TABLE_VALUE_COLUMN, "value");
> configuration.add(IpkSymbols.CONFIG_TABLE_ENABLED_COLUMN, "enabled");
> configuration.add(IpkSymbols.CONFIG_TABLE_REFRESH_INTERVAL, "1");
> }


I'm running the application in eclipse while providing the vm option "
-DIPK_DB"

But when I start my application I get the following exception

> 2012-09-08 14:38:01.675:WARN::failed app: java.lang.RuntimeException:
> Exception constructing service 'ComponentClassResolver': Exception
> constructing service 'IpkConfig': Exception constructing service
> 'IpkConfig': Construction of service 'IpkConfig' has failed due to
> recursion: the service depends on itself in some way. Please check
> com.skycomm.ipkaizen.portal.services.config.ConfigurationSourceImpl(Logger)
> (at ConfigurationSourceImpl.java:37) via
> com.skycomm.ipkaizen.portal.core.services.CoreModule.bind(ServiceBinder)
> (at CoreModule.java:36) for references to another service that is itself
> dependent on service 'IpkConfig'.
>


> 2012-09-08 14:38:01.675:WARN::Failed startup of context
> org.mortbay.jetty.webapp.WebAppContext@627787a5{/,E:\Workspace\Eclipse\IpKaizen
> - Portal\src\main\webapp}
> java.lang.RuntimeException: Exception constructing service
> 'ComponentClassResolver': Exception constructing service 'IpkConfig':
> Exception constructing service 'IpkConfig': Construction of service
> 'IpkConfig' has failed due to recursion: the service depends on itself in
> some way. Please check
> com.skycomm.ipkaizen.portal.services.config.ConfigurationSourceImpl(Logger)
> (at ConfigurationSourceImpl.java:37) via
> com.skycomm.ipkaizen.portal.core.services.CoreModule.bind(ServiceBinder)
> (at CoreModule.java:36) for references to another service that is itself
> dependent on service 'IpkConfig'.
> at
> org.apache.tapestry5.ioc.internal.services.JustInTimeObjectCreator.obtainObjectFromCreator(JustInTimeObjectCreator.java:75)
> at
> org.apache.tapestry5.ioc.internal.services.JustInTimeObjectCreator.createObject(JustInTimeObjectCreator.java:54)
> at $ComponentClassResolver_443d1b1e6040.delegate(Unknown Source)
> at $ComponentClassResolver_443d1b1e6040.isPageName(Unknown Source)
> at
> org.apache.tapestry5.services.TapestryModule$40.initializeApplication(TapestryModule.java:2440)
> at $ApplicationInitializer_443d1b1e6042.initializeApplication(Unknown
> Source)
> at $ApplicationInitializer_443d1b1e603e.initializeApplication(Unknown
> Source)
> at
> org.apache.tapestry5.services.TapestryModule$ServletApplicationInitializerTerminator.initializeApplication(TapestryModule.java:279)
> at
> $ServletApplicationInitializer_443d1b1e6024.initializeApplication(Unknown
> Source)
> at org.apache.tapestry5.TapestryFilter.init(TapestryFilter.java:116)
> at org.mortbay.jetty.servlet.FilterHolder.doStart(FilterHolder.java:97)
> at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
> at
> org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:713)
> at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
> at
> org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1282)
> at
> org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:518)
> at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:499)
> at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
> at
> org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
> at org.mortbay.jetty.Server.doStart(Server.java:224)
> at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
> at runjettyrun.Bootstrap.main(Bootstrap.java:97)
> 2012-09-08 14:38:01.712:INFO::Started SelectChannelConnector@0.0.0.0:80


Is it not possible to have a symbol provider that depends on symbols it
self ?

Re: [t.5.3.4] Couldn't use a symbol-dependant SymbolProvider

Posted by Lance Java <la...@googlemail.com>.
This should be possible but you won't be able @Symbol and you will need to
reference specific symbol providers (by name or annotation).

eg:

// FactoryDefaults are resolved before application defaults
public void contributeFactoryDefaults(MappedConfiguration<String,String>
config) {
   config.add("mySymbol1", "foo");
}

// ApplicationDefaults can depend on FactoryDefaults
public void contributeApplicationDefaults(MappedConfiguration<String,String>
config, @InjectService("FactoryDefaults") SymbolProvider factoryDefaults) {
   String mySymbol1 = factoryDefaults.valueForSymbol("mySymbol1");
   config.add("mySymbol2", doSomething(mySymbol1));
}



--
View this message in context: http://tapestry.1045711.n5.nabble.com/t-5-3-4-Couldn-t-use-a-symbol-dependant-SymbolProvider-tp5716141p5716158.html
Sent from the Tapestry - User mailing list archive at Nabble.com.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org