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