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
>

Reply via email to