I'm willing to use uncached symbols at the moment for 2 reasons. 1) Saving massive refactoring effor, 2) I really want to know how to do this !
I implemented the following: > public static void bind(ServiceBinder binder) { > binder.bind(IDBSymbolSource.class, DBSymbolSource.class); > //Binding the source to SymbolSource forces me to assign an ID to that > bind as Tapestry complains about binding the same service interface > and it makes it easier to contribute to the service (only using it's > interface). Also the interface extends SymbolSource. > } > @Contribute(IDBSymbolSource.class) > public static void > contributeDBSymbolSource(OrderedConfiguration<SymbolProvider> > configuration, @Named("IpkConfig") SymbolProvider ipkConfig, > @Named("IxConfig") SymbolProvider ixConfig) { > configuration.add("SystemProperties", new > SystemPropertiesSymbolProvider(), "before:*"); > configuration.add("IpkConfig", ipkConfig, "after:SystemProperties"); > configuration.add("IxConfig", ixConfig, "after:SystemProperties"); > } > @Contribute(MasterObjectProvider.class) > public static void > setupDBSYmbolObjectProviders(OrderedConfiguration<ObjectProvider> > configuration) { > configuration.addInstance("DBSymbol", DBSymbolObjectProvider.class, > OrderConstraintBuilder.before("Symbol").build()); > } The DBSymbolObjectProvider constructor is: > public DBSymbolObjectProvider(IDBSymbolSource symbolSource, @Builtin > TypeCoercer typeCoercer) { > this.symbolSource = symbolSource; > this.typeCoercer = typeCoercer; > } I think the following exception is thrown because the *IDBSymbolSource *service in the constructor needs to be resolved while the *MasterObjectProvider *it self hasn't been constructed which is reasonable but how can I resolve this ? java.lang.RuntimeException: Exception constructing service > 'RegistryStartup': Unable to instantiate class com.skycomm.IpKaizenTAModule > as a module: Exception constructing service 'MasterObjectProvider': Error > invoking service contribution method > com.skycomm.ipkaizen.services.CoreModule.setupDBSYmbolObjectProviders(OrderedConfiguration): > Exception constructing service 'MasterObjectProvider': Construction of > service 'MasterObjectProvider' has failed due to recursion: the service > depends on itself in some way. Please check > org.apache.tapestry5.ioc.internal.services.MasterObjectProviderImpl(List, > OperationTracker) (at MasterObjectProviderImpl.java:33) via > org.apache.tapestry5.ioc.services.TapestryIOCModule.bind(ServiceBinder) (at > TapestryIOCModule.java:49) for references to another service that is itself > dependent on service 'MasterObjectProvider'. > > 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 $Runnable_440ab1f4dbb6.delegate(Unknown Source) > at $Runnable_440ab1f4dbb6.run(Unknown Source) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.performRegistryStartup(RegistryImpl.java:325) > at > org.apache.tapestry5.ioc.internal.RegistryWrapper.performRegistryStartup(RegistryWrapper.java:80) > at com.skycomm.IpKaizenTA.main(IpKaizenTA.java:25) > Caused by: java.lang.RuntimeException: Unable to instantiate class > com.skycomm.IpKaizenTAModule as a module: Exception constructing service > 'MasterObjectProvider': Error invoking service contribution method > com.skycomm.ipkaizen.services.CoreModule.setupDBSYmbolObjectProviders(OrderedConfiguration): > Exception constructing service 'MasterObjectProvider': Construction of > service 'MasterObjectProvider' has failed due to recursion: the service > depends on itself in some way. Please check > org.apache.tapestry5.ioc.internal.services.MasterObjectProviderImpl(List, > OperationTracker) (at MasterObjectProviderImpl.java:33) via > org.apache.tapestry5.ioc.services.TapestryIOCModule.bind(ServiceBinder) (at > TapestryIOCModule.java:49) for references to another service that is itself > dependent on service 'MasterObjectProvider'. > at > org.apache.tapestry5.ioc.internal.ModuleImpl.instantiateModuleInstance(ModuleImpl.java:447) > at > org.apache.tapestry5.ioc.internal.ModuleImpl.access$1200(ModuleImpl.java:39) > at > org.apache.tapestry5.ioc.internal.ModuleImpl$6$1.invoke(ModuleImpl.java:355) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74) > at > org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:87) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1124) > at org.apache.tapestry5.ioc.internal.ModuleImpl$6.run(ModuleImpl.java:350) > at > org.apache.tapestry5.ioc.internal.util.ConcurrentBarrier$2.invoke(ConcurrentBarrier.java:200) > at > org.apache.tapestry5.ioc.internal.util.ConcurrentBarrier$2.invoke(ConcurrentBarrier.java:197) > at > org.apache.tapestry5.ioc.internal.util.ConcurrentBarrier.withWrite(ConcurrentBarrier.java:140) > at > org.apache.tapestry5.ioc.internal.util.ConcurrentBarrier.withWrite(ConcurrentBarrier.java:206) > at > org.apache.tapestry5.ioc.internal.ModuleImpl$7.invoke(ModuleImpl.java:366) > at > org.apache.tapestry5.ioc.internal.util.ConcurrentBarrier.withRead(ConcurrentBarrier.java:85) > at > org.apache.tapestry5.ioc.internal.ModuleImpl.getModuleBuilder(ModuleImpl.java:374) > at > org.apache.tapestry5.ioc.internal.ContributionDefImpl.invokeMethod(ContributionDefImpl.java:113) > at > org.apache.tapestry5.ioc.internal.ContributionDefImpl.contribute(ContributionDefImpl.java:80) > at > org.apache.tapestry5.ioc.internal.RegistryImpl$9.run(RegistryImpl.java:633) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl$1.invoke(OperationTrackerImpl.java:51) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl$1.invoke(OperationTrackerImpl.java:48) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.run(OperationTrackerImpl.java:47) > at > org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.run(PerThreadOperationTracker.java:76) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.addToOrderedConfiguration(RegistryImpl.java:629) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.getOrderedConfiguration(RegistryImpl.java:483) > at > org.apache.tapestry5.ioc.internal.ServiceResourcesImpl$2.invoke(ServiceResourcesImpl.java:110) > at > org.apache.tapestry5.ioc.internal.ServiceResourcesImpl$2.invoke(ServiceResourcesImpl.java:107) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74) > at > org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:87) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1124) > at > org.apache.tapestry5.ioc.internal.ServiceResourcesImpl.getOrderedConfiguration(ServiceResourcesImpl.java:105) > at > org.apache.tapestry5.ioc.internal.AbstractServiceCreator.getOrderedConfiguration(AbstractServiceCreator.java:123) > at > org.apache.tapestry5.ioc.internal.AbstractServiceCreator.access$200(AbstractServiceCreator.java:35) > at > org.apache.tapestry5.ioc.internal.AbstractServiceCreator$1.findResource(AbstractServiceCreator.java:103) > at > org.apache.tapestry5.ioc.internal.util.DelegatingInjectionResources.findResource(DelegatingInjectionResources.java:38) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils.calculateInjection(InternalUtils.java:231) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils.access$000(InternalUtils.java:50) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils$4.invoke(InternalUtils.java:289) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils$4.invoke(InternalUtils.java:286) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74) > at > org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:87) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1124) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils.calculateParameters(InternalUtils.java:293) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils$23.invoke(InternalUtils.java:1488) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils$23.invoke(InternalUtils.java:1483) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74) > at > org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:87) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1124) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils.createConstructorConstructionPlan(InternalUtils.java:1480) > at > org.apache.tapestry5.ioc.internal.ConstructorServiceCreator.getPlan(ConstructorServiceCreator.java:52) > at > org.apache.tapestry5.ioc.internal.ConstructorServiceCreator.createObject(ConstructorServiceCreator.java:61) > at > org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator$1.invoke(OperationTrackingObjectCreator.java:45) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74) > at > org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:87) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1124) > at > org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator.createObject(OperationTrackingObjectCreator.java:49) > at > org.apache.tapestry5.ioc.internal.SingletonServiceLifecycle.createService(SingletonServiceLifecycle.java:29) > at > org.apache.tapestry5.ioc.internal.LifecycleWrappedServiceCreator.createObject(LifecycleWrappedServiceCreator.java:46) > at > org.apache.tapestry5.ioc.internal.AdvisorStackBuilder.createObject(AdvisorStackBuilder.java:63) > at > org.apache.tapestry5.ioc.internal.InterceptorStackBuilder.createObject(InterceptorStackBuilder.java:54) > at > org.apache.tapestry5.ioc.internal.RecursiveServiceCreationCheckWrapper.createObject(RecursiveServiceCreationCheckWrapper.java:60) > at > org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator$1.invoke(OperationTrackingObjectCreator.java:45) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74) > at > org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:87) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1124) > at > org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator.createObject(OperationTrackingObjectCreator.java:49) > at > org.apache.tapestry5.ioc.internal.services.JustInTimeObjectCreator.obtainObjectFromCreator(JustInTimeObjectCreator.java:66) > ... 6 more > Caused by: java.lang.RuntimeException: Exception constructing service > 'MasterObjectProvider': Error invoking service contribution method > com.skycomm.ipkaizen.services.CoreModule.setupDBSYmbolObjectProviders(OrderedConfiguration): > Exception constructing service 'MasterObjectProvider': Construction of > service 'MasterObjectProvider' has failed due to recursion: the service > depends on itself in some way. Please check > org.apache.tapestry5.ioc.internal.services.MasterObjectProviderImpl(List, > OperationTracker) (at MasterObjectProviderImpl.java:33) via > org.apache.tapestry5.ioc.services.TapestryIOCModule.bind(ServiceBinder) (at > TapestryIOCModule.java:49) for references to another service that is itself > dependent on service 'MasterObjectProvider'. > 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 $MasterObjectProvider_440ab1f4dbb7.delegate(Unknown Source) > at $MasterObjectProvider_440ab1f4dbb7.provide(Unknown Source) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.getObject(RegistryImpl.java:871) > at > org.apache.tapestry5.ioc.internal.ObjectLocatorImpl.getObject(ObjectLocatorImpl.java:57) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils$6.run(InternalUtils.java:371) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl$1.invoke(OperationTrackerImpl.java:51) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl$1.invoke(OperationTrackerImpl.java:48) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.run(OperationTrackerImpl.java:47) > at > org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.run(PerThreadOperationTracker.java:76) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.run(RegistryImpl.java:1119) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils.injectIntoFields(InternalUtils.java:338) > at > org.apache.tapestry5.ioc.internal.ModuleImpl.instantiateModuleInstance(ModuleImpl.java:433) > ... 71 more > Caused by: java.lang.RuntimeException: Error invoking service contribution > method > com.skycomm.ipkaizen.services.CoreModule.setupDBSYmbolObjectProviders(OrderedConfiguration): > Exception constructing service 'MasterObjectProvider': Construction of > service 'MasterObjectProvider' has failed due to recursion: the service > depends on itself in some way. Please check > org.apache.tapestry5.ioc.internal.services.MasterObjectProviderImpl(List, > OperationTracker) (at MasterObjectProviderImpl.java:33) via > org.apache.tapestry5.ioc.services.TapestryIOCModule.bind(ServiceBinder) (at > TapestryIOCModule.java:49) for references to another service that is itself > dependent on service 'MasterObjectProvider'. > at > org.apache.tapestry5.ioc.internal.ContributionDefImpl.invokeMethod(ContributionDefImpl.java:130) > at > org.apache.tapestry5.ioc.internal.ContributionDefImpl.contribute(ContributionDefImpl.java:80) > at > org.apache.tapestry5.ioc.internal.RegistryImpl$9.run(RegistryImpl.java:633) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl$1.invoke(OperationTrackerImpl.java:51) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl$1.invoke(OperationTrackerImpl.java:48) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.run(OperationTrackerImpl.java:47) > at > org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.run(PerThreadOperationTracker.java:76) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.addToOrderedConfiguration(RegistryImpl.java:629) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.getOrderedConfiguration(RegistryImpl.java:483) > at > org.apache.tapestry5.ioc.internal.ServiceResourcesImpl$2.invoke(ServiceResourcesImpl.java:110) > at > org.apache.tapestry5.ioc.internal.ServiceResourcesImpl$2.invoke(ServiceResourcesImpl.java:107) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74) > at > org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:87) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1124) > at > org.apache.tapestry5.ioc.internal.ServiceResourcesImpl.getOrderedConfiguration(ServiceResourcesImpl.java:105) > at > org.apache.tapestry5.ioc.internal.AbstractServiceCreator.getOrderedConfiguration(AbstractServiceCreator.java:123) > at > org.apache.tapestry5.ioc.internal.AbstractServiceCreator.access$200(AbstractServiceCreator.java:35) > at > org.apache.tapestry5.ioc.internal.AbstractServiceCreator$1.findResource(AbstractServiceCreator.java:103) > at > org.apache.tapestry5.ioc.internal.util.DelegatingInjectionResources.findResource(DelegatingInjectionResources.java:38) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils.calculateInjection(InternalUtils.java:231) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils.access$000(InternalUtils.java:50) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils$4.invoke(InternalUtils.java:289) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils$4.invoke(InternalUtils.java:286) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74) > at > org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:87) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1124) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils.calculateParameters(InternalUtils.java:293) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils$23.invoke(InternalUtils.java:1488) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils$23.invoke(InternalUtils.java:1483) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74) > at > org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:87) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1124) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils.createConstructorConstructionPlan(InternalUtils.java:1480) > at > org.apache.tapestry5.ioc.internal.ConstructorServiceCreator.getPlan(ConstructorServiceCreator.java:52) > at > org.apache.tapestry5.ioc.internal.ConstructorServiceCreator.createObject(ConstructorServiceCreator.java:61) > at > org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator$1.invoke(OperationTrackingObjectCreator.java:45) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74) > at > org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:87) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1124) > at > org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator.createObject(OperationTrackingObjectCreator.java:49) > at > org.apache.tapestry5.ioc.internal.SingletonServiceLifecycle.createService(SingletonServiceLifecycle.java:29) > at > org.apache.tapestry5.ioc.internal.LifecycleWrappedServiceCreator.createObject(LifecycleWrappedServiceCreator.java:46) > at > org.apache.tapestry5.ioc.internal.RecursiveServiceCreationCheckWrapper.createObject(RecursiveServiceCreationCheckWrapper.java:60) > at > org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator$1.invoke(OperationTrackingObjectCreator.java:45) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74) > at > org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:87) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1124) > at > org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator.createObject(OperationTrackingObjectCreator.java:49) > at > org.apache.tapestry5.ioc.internal.services.JustInTimeObjectCreator.obtainObjectFromCreator(JustInTimeObjectCreator.java:66) > ... 85 more > Caused by: java.lang.RuntimeException: Exception constructing service > 'MasterObjectProvider': Construction of service 'MasterObjectProvider' has > failed due to recursion: the service depends on itself in some way. Please > check > org.apache.tapestry5.ioc.internal.services.MasterObjectProviderImpl(List, > OperationTracker) (at MasterObjectProviderImpl.java:33) via > org.apache.tapestry5.ioc.services.TapestryIOCModule.bind(ServiceBinder) (at > TapestryIOCModule.java:49) for references to another service that is itself > dependent on service 'MasterObjectProvider'. > 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 $MasterObjectProvider_440ab1f4dbb7.delegate(Unknown Source) > at $MasterObjectProvider_440ab1f4dbb7.provide(Unknown Source) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.getObject(RegistryImpl.java:871) > at > org.apache.tapestry5.ioc.internal.ObjectLocatorImpl.getObject(ObjectLocatorImpl.java:57) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils.calculateInjection(InternalUtils.java:257) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils.access$000(InternalUtils.java:50) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils$4.invoke(InternalUtils.java:289) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils$4.invoke(InternalUtils.java:286) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74) > at > org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:87) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1124) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils.calculateParameters(InternalUtils.java:293) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils$23.invoke(InternalUtils.java:1488) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils$23.invoke(InternalUtils.java:1483) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74) > at > org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:87) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1124) > at > org.apache.tapestry5.ioc.internal.util.InternalUtils.createConstructorConstructionPlan(InternalUtils.java:1480) > at > org.apache.tapestry5.ioc.internal.ConstructorServiceCreator.getPlan(ConstructorServiceCreator.java:52) > at > org.apache.tapestry5.ioc.internal.ConstructorServiceCreator.createObject(ConstructorServiceCreator.java:61) > at > org.apache.tapestry5.ioc.internal.ServiceResourcesImpl$4.invoke(ServiceResourcesImpl.java:160) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74) > at > org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:87) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1124) > at > org.apache.tapestry5.ioc.internal.ServiceResourcesImpl.autobuild(ServiceResourcesImpl.java:146) > at > org.apache.tapestry5.ioc.internal.ServiceResourcesImpl.autobuild(ServiceResourcesImpl.java:170) > at > org.apache.tapestry5.ioc.internal.AbstractConfigurationImpl.instantiate(AbstractConfigurationImpl.java:45) > at > org.apache.tapestry5.ioc.internal.ValidatingOrderedConfigurationWrapper.addInstance(ValidatingOrderedConfigurationWrapper.java:95) > at > com.skycomm.ipkaizen.services.CoreModule.setupDBSYmbolObjectProviders(CoreModule.java:51) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) > at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) > at java.lang.reflect.Method.invoke(Unknown Source) > at > org.apache.tapestry5.ioc.internal.ContributionDefImpl.invokeMethod(ContributionDefImpl.java:120) > ... 134 more > Caused by: org.apache.tapestry5.ioc.internal.OperationException: > Construction of service 'MasterObjectProvider' has failed due to recursion: > the service depends on itself in some way. Please check > org.apache.tapestry5.ioc.internal.services.MasterObjectProviderImpl(List, > OperationTracker) (at MasterObjectProviderImpl.java:33) via > org.apache.tapestry5.ioc.services.TapestryIOCModule.bind(ServiceBinder) (at > TapestryIOCModule.java:49) for references to another service that is itself > dependent on service 'MasterObjectProvider'. > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.logAndRethrow(OperationTrackerImpl.java:121) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:88) > at > org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:87) > at > org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1124) > at > org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator.createObject(OperationTrackingObjectCreator.java:49) > at > org.apache.tapestry5.ioc.internal.services.JustInTimeObjectCreator.obtainObjectFromCreator(JustInTimeObjectCreator.java:66) > ... 169 more > Caused by: java.lang.IllegalStateException: Construction of service > 'MasterObjectProvider' has failed due to recursion: the service depends on > itself in some way. Please check > org.apache.tapestry5.ioc.internal.services.MasterObjectProviderImpl(List, > OperationTracker) (at MasterObjectProviderImpl.java:33) via > org.apache.tapestry5.ioc.services.TapestryIOCModule.bind(ServiceBinder) (at > TapestryIOCModule.java:49) for references to another service that is itself > dependent on service 'MasterObjectProvider'. > at > org.apache.tapestry5.ioc.internal.RecursiveServiceCreationCheckWrapper.createObject(RecursiveServiceCreationCheckWrapper.java:52) > at > org.apache.tapestry5.ioc.internal.OperationTrackingObjectCreator$1.invoke(OperationTrackingObjectCreator.java:45) > at > org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74) > ... 173 more > > On Mon, Sep 17, 2012 at 7:41 PM, Muhammad Gelbana <m.gelb...@gmail.com>wrote: > *@Lance* > >> Are you running into a "chicken or the egg scanerio"? > > No. I don't think so it's just that I was trying to make tapestry not > cache my symbols values. What gave you that impression ? > > > *@Thiago* > >> Don't forget that you can create your own Symbol-like annotation to >> inject your mutable configuration symbols without using your service >> directly. > > That's exactly what I was trying to do. Just to get my feet wet with > tapestry. > > You need to contribute your ServiceProviders to the SymbolSource service, >> not MasterObjectProvider. There's no need > > But I need a source that doesn't cache it's values. I'm contributing a * > SymbolObjectProvider* because I cannot contribute my providers to the > default *SymbolSource* which caches values and has 1 to 1 relationship > with *SymbolObjectProvider*. So I think I need to contribute my own * > SymbolObjectProvider* (i.e. *DBSymbolObjectProvider*) along with my own * > SymbolSource* (i.e. *DBSymbolSource*) which doesn't cache values and > contribute to the latter my own *SymbolProviders*. > > So all this is to have uncachable symbols. But about the solution I'll > finally implement, which is to inject my own *SymbolSource* which doesn't > cache values with my *SymbolProviders* contributed to it, is it ok to > also contribute the *SystemPropertiesProvider* contributed to it too ? > Because I'll need to expand symbols in my custom *SymbolProviders*. For > example: > > My providers will have symbols such as: testagent.{ta.id}.enabled > And my application will startup with a JVM option -Dta.id=XXX > > So I need to contribute *SystemPropertiesProvider* to my new *SymbolSource > *, will there by any issue I didn't notice ? I assume not, just asking > the developers. > > Thank you all a lot for your time. > > > On Mon, Sep 17, 2012 at 6:45 PM, Thiago H de Paula Figueiredo < > thiag...@gmail.com> wrote: > >> On Mon, 17 Sep 2012 12:40:50 -0300, Muhammad Gelbana <m.gelb...@gmail.com> >> wrote: >> >> >>>> Why don't you just @Inject your SymbolProvider implementation in the >>>> place >>>> you need the mutable configurations and use it directly instead of using >>>> SymbolSource? >>>> >>> >>> You are talking about injecting a service and calling it's methods for >>> values, correct ? Anyway, I guess I don't have another option. >>> >> >> Yep. Don't forget that you can create your own Symbol-like annotation to >> inject your mutable configuration symbols without using your service >> directly. In Tapestry sources, take a look at SymbolObjectProvider and >> TapestryIOCModule to know how to wire it into Tapestry-IoC. >> >> One more thing, although I'll follow your advice, but I still want to >>> know how to do this the *@Symbol* way. I tried to contribute a symbol object >>> >>> provider with it's own symbol source and the symbol source it self has my >>> own symbol providers dealing with the database, but it isn't working. I'm >>> just trying to figure out my mistake. >>> >>> @Contribute(**MasterObjectProvider.class) >>> >>>> public static void >>>> setupDBSYmbolObjectProviders(**OrderedConfiguration<**ObjectProvider> >>>> configuration) { >>>> configuration.addInstance("**DBSymbol", DBSymbolObjectProvider.class, >>>> OrderConstraintBuilder.before(**"AnnotationBasedContributions"** >>>> ).build()); >>>> } >>>> >>> >> You need to contribute your ServiceProviders to the SymbolSource service, >> not MasterObjectProvider. There's no need >> >> *DBSymbolObjectProvider* implements *ObjectProvider* and actually get's >>> >>> built with my own symbol source. My symbol source is built this way: >>> >>> public SymbolSource buildDBSymbolSource(@Named("**IpkConfig") >>> SymbolProvider >>> >>>> ipkConfig, @Named("IxProConfig") SymbolProvider ixProConfig) { >>>> return new DBSymbolSource(Arrays.asList(**ipkConfig, ixProConfig)); >>>> } >>>> >>> >> You're just creating a service named DBSymbolSource, while you should >> contribute your service providers to the SymbolSource service instead. >> >> >> -- >> Thiago H. de Paula Figueiredo >> > >