Yes, I've noticed. Great work Igor :) I've intentionally not done anything for tapestry-cdi in terms of supporting javax.inject.@Inject.
As Tap @inject and javax @inject are interchangeable - cdi bean injection with either @inject should 'just work' with tapestry-cdi and T5.3 :) On Thu, Aug 18, 2011 at 12:56 PM, Igor Drobiazko <igor.drobia...@gmail.com>wrote: > Just as a side note: starting with T5.3 it's possible to use JSR 330 for > injection. > > Check this out: > http://tapestry.apache.org/using-jsr-330-standard-annotations.html > > On Wed, Jun 8, 2011 at 1:56 PM, Magnus Kvalheim <mag...@kvalheim.dk> > wrote: > > > Hi all, > > > > We're looking into moving our apps from a 'traditional' servlet container > > with spring into a Java EE web profile server like glassfish 3.1. > > Motivations for doing this is to utilize cdi(jsr 299, 330), ejb3 and > more. > > Not just for the tapestry app, but also the other applications in > > our portfoleo which share common core business logic. > > > > For reference on previous discussions: > > > > > http://tapestry.1045711.n5.nabble.com/Java-based-spring-configuration-td3394086.html > > http://tapestry.1045711.n5.nabble.com/Discussion-td2421783i20.html > > > > Now, I've tried running the tapestry quickstart app in glassfish 3.1 > (with > > the eclipse connector for publishing). > > This works ok - although I cannot make live class reloading work. :( > > > > Glassfish uses Weld, so the CDIModule is basically an objectprovider for > > injecting Weld managed beans. > > (As you probably know CDI/Weld can also be used outside jee as > alternative > > to tapestry-ioc, spring, etc) > > > > *CDIModule class* > > *public class CDIModule { * > > * public static void bind(ServiceBinder binder) {* > > * binder.bind(ObjectProvider.class, > > CDIObjectProvider.class).withId("CDIObjectProvider"); * > > * } * > > * public static BeanManager buildBeanManager(Logger log) { * > > * try {* > > * BeanManager beanManager = (BeanManager) new > > InitialContext().lookup("java:comp/BeanManager");* > > * return beanManager; * > > * } catch (NamingException e) {* > > * log.error("Could not lookup jndi resource: java:comp/BeanManager", e);* > > * }* > > * return null;* > > * } * > > * public static void contributeMasterObjectProvider(* > > * @InjectService("CDIObjectProvider") ObjectProvider cdiProvider,* > > * OrderedConfiguration<ObjectProvider> configuration) { * > > *// configuration.add("cdiProvider", cdiProvider, > > > > > "after:Service,after:AnnotationBasedContributions,after:Alias,after:Autobuild"); > > * > > * configuration.add("cdiProvider", cdiProvider, "after:*"); * > > * } * > > *}* > > * > > * > > The beanmanager is expected to be found in jndi. If the beans.xml is > > present > > it will be available at this point. > > The BeanManager is also exposed as a service and injectable for other > > services or components. > > I've tested by adding the *@SubModule(CDIModule.class) *to my quickstart > > appmodule. > > * > > * > > *CDIObjectProvider class* > > *public class CDIObjectProvider implements ObjectProvider { * > > * private BeanManager beanManager;* > > * private Logger log;* > > * * > > * @SuppressWarnings({ "unchecked", "rawtypes" })* > > * private Set allowedScopes = CollectionFactory.newSet(* > > * ApplicationScoped.class,* > > * Singleton.class);* > > * > > * > > * public CDIObjectProvider(* > > * Logger log,* > > * @InjectService("BeanManager") BeanManager manager) {* > > * this.beanManager = manager;* > > * this.log = log;* > > * }* > > * @SuppressWarnings("unchecked")* > > * public <T> T provide(Class<T> objectType,* > > * AnnotationProvider annotationProvider, ObjectLocator locator) {* > > * Set<Bean<?>> beans = beanManager.getBeans(objectType);* > > * if(beans!=null && beans.size()>0) {* > > * Bean<T> bean = (Bean<T>) beans.iterator().next(); * > > * if(hasValidScope(bean)) {* > > * CreationalContext<T> ctx = beanManager.createCreationalContext(bean);* > > * T o = (T) beanManager.getReference(bean, objectType, ctx); * > > * log.info("Found and returning: "+objectType.getCanonicalName());* > > * return o; * > > * }* > > * }* > > * return null;* > > * } * > > * protected <T> boolean hasValidScope(Bean<T> bean) {* > > * return bean!=null && allowedScopes.contains(bean.getScope());* > > * }* > > *}* > > > > I've limited the scope to singleton/applicationscoped. Perhaps also > Default > > could be accepted though. > > Until now I've only tested this with pojo's and not ejb's - but for that > > it's working as expected. > > I can inject CDI beans into pages and components using* > > org.apache.tapestry5.ioc.annotations.Inject* > > > > I'm no expert to tapestry internals - so there could be > > other considerations that needs to be addressed. > > In fact in seemed just a little to easy to implement - so I must have > > missed > > something. - Or perhaps it's just that easy to do in Tapestry :) > > > > Thoughts, comments? > > > > > > -- > Best regards, > > Igor Drobiazko > http://tapestry5.de >