Re: Hooking a custom InjectionProvider into the IoC container
On Mon, 30 Apr 2012 23:04:13 -0300, Pavel Vodenski pa...@beckon.com wrote: But that gives me the following error: java.lang.IllegalArgumentException: Contribution com.beckon.app.services.AppModule.contributeInjectionProvider2(OrderedConfiguration, MasterObjectProvider, ObjectLocator, SymbolSource, AssetSource) (at AppModule.java:92) is for service 'InjectionProvider2', which does not exist. The error message says you're trying to contribute configuration for a service that doesn't exist. Are you trying to run this without tapestry-core (the web framework)? -- Thiago H. de Paula Figueiredo Independent Java, Apache Tapestry 5 and Hibernate consultant, developer, and instructor Owner, Ars Machina Tecnologia da Informação Ltda. http://www.arsmachina.com.br - To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org
Re: Hooking a custom InjectionProvider into the IoC container
The error message says you're trying to contribute configuration for a service that doesn't exist. Are you trying to run this without tapestry-core (the web framework)? I am using tapestry-core. The snippet I posted came out of our tapestry project's AppModule class. On Tue, May 1, 2012 at 5:59 AM, Thiago H. de Paula Figueiredo thiag...@gmail.com wrote: On Mon, 30 Apr 2012 23:04:13 -0300, Pavel Vodenski pa...@beckon.com wrote: But that gives me the following error: java.lang.**IllegalArgumentException: Contribution com.beckon.app.services.**AppModule.**contributeInjectionProvider2(** OrderedConfiguration, MasterObjectProvider, ObjectLocator, SymbolSource, AssetSource) (at AppModule.java:92) is for service 'InjectionProvider2', which does not exist. The error message says you're trying to contribute configuration for a service that doesn't exist. Are you trying to run this without tapestry-core (the web framework)? -- Thiago H. de Paula Figueiredo Independent Java, Apache Tapestry 5 and Hibernate consultant, developer, and instructor Owner, Ars Machina Tecnologia da Informação Ltda. http://www.arsmachina.com.br
Re: Hooking a custom InjectionProvider into the IoC container
After some more experimentation, I've corrected an error in my original contribution method. It should've read: public static void contributeInjectionProvider( OrderedConfigurationInjectionProvider2 configuration, MasterObjectProvider masterObjectProvider, ObjectLocator locator, SymbolSource symbolSource, AssetSource assetSource) { configuration.add(BeckonLogger, new BeckonLoggerInjectionProvider(), before:Default); } When I include this method in my AppModule, my InjectionProvider implementation get a chance to provide implementations for Pages and Components, which is most of what I'd like to do. However, I'd also like my InjectionProvider to act on objects built during the Registry Startup phase. In particular, I configure a database in a submodule method annotated with @Startup. @Inject-annotated fields of objects built in that phase are not seen by my InjectionProvider. I found a thread from last year that discusses a very similar goal: http://markmail.org/thread/ny4xefhxzuwrus3e. That thread culminated in tapestry-cdi: https://github.com/magnuskvalheim/tapestry-cdi . I tried to follow the same approach--contributing my InjectionProvider in a totally separate Module which tapestry should've seen via autoloading, but I can't seem to get autoloading right. I added the following block to my pom.xml: plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-jar-plugin/artifactId version2.3.2/version configuration archive manifestEntries Tapestry-Module-Classescom.beckon.util.log.BeckonLoggerInjectionModule/Tapestry-Module-Classes /manifestEntries /archive /configuration /plugin This correctly adds the Tapestry-Module-Classes line to the MANIFEST.MF of jars built using mvn jar:jar, but I don't believe it affects the archive built by mvn jetty:run. In any case, my LoggerInjectionModule doesn't appear in the list of modules added by ioc.RegistryBuilder. Any suggestions regarding contributing InjectionProviders before the Startup phase or troubleshooting autoloading when using the jetty:run maven goal? Thank you, - Pavel On Tue, May 1, 2012 at 2:28 PM, Pavel Vodenski pa...@beckon.com wrote: The error message says you're trying to contribute configuration for a service that doesn't exist. Are you trying to run this without tapestry-core (the web framework)? I am using tapestry-core. The snippet I posted came out of our tapestry project's AppModule class. On Tue, May 1, 2012 at 5:59 AM, Thiago H. de Paula Figueiredo thiag...@gmail.com wrote: On Mon, 30 Apr 2012 23:04:13 -0300, Pavel Vodenski pa...@beckon.com wrote: But that gives me the following error: java.lang.**IllegalArgumentException: Contribution com.beckon.app.services.**AppModule.**contributeInjectionProvider2(** OrderedConfiguration, MasterObjectProvider, ObjectLocator, SymbolSource, AssetSource) (at AppModule.java:92) is for service 'InjectionProvider2', which does not exist. The error message says you're trying to contribute configuration for a service that doesn't exist. Are you trying to run this without tapestry-core (the web framework)? -- Thiago H. de Paula Figueiredo Independent Java, Apache Tapestry 5 and Hibernate consultant, developer, and instructor Owner, Ars Machina Tecnologia da Informação Ltda. http://www.arsmachina.com.br
Hooking a custom InjectionProvider into the IoC container
Tapestry Users, I'd like to contribute an InjectionProvider2http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/transform/InjectionProvider2.html into the chain that processes @Inject annotations. The cookbook example that illustrates the chain of command patternhttp://tapestry.apache.org/ioc-cookbook-patterns.html cites how Tapestry IOC's own injection provider is built. The example says, And, of course, other contributions could be made in other modules ... if you wanted to add in your own form of injection. So, I tried copying a similar method into my AppModule: public static void contributeInjectionProvider2( OrderedConfigurationInjectionProvider2 configuration, MasterObjectProvider masterObjectProvider, ObjectLocator locator, SymbolSource symbolSource, AssetSource assetSource) { configuration.add(BeckonLogger, new InjectionProvider2() { public boolean provideInjection(PlasticField field, ObjectLocator locator1, MutableComponentModel componentModel) { if (field.getTypeName().equals(com.beckon.app.util.log.BeckonLogger)) { field.inject(BeckonLoggerImpl.getLogger(field.getPlasticClass().getClassName())); return true; } return false; } }); } But that gives me the following error: java.lang.IllegalArgumentException: Contribution com.beckon.app.services.AppModule.contributeInjectionProvider2(OrderedConfiguration, MasterObjectProvider, ObjectLocator, SymbolSource, AssetSource) (at AppModule.java:92) is for service 'InjectionProvider2', which does not exist. Is there a different way that I should contribute my InjectionProvider2? More generally, what is the best way to add a custom form of injection? More generally still, my overarching goal is to be able to instiate my own logger with the name of the owning class and to use @Inject to describe the dependency--is there a way to customize or otherwise use one of the existing InjectionProviders to do that? Thank you in advance, - Pavel