+1
Did you have a look at https://github.com/got5/cdi-tapestry-contribution?

François

2013/3/9 Kalle Korhonen <kalle.o.korho...@gmail.com>:
> Hey Magnus,
>
> as part of your tapestry-cdi work, did you look into implementing a
> Tapestry CDI SPI, i.e. an implementation of
> javax.enterprise.inject.spi.BeanManager? This is related to my earlier
> thread about injectable entitylisteners (
> http://mail-archives.apache.org/mod_mbox/tapestry-dev/201210.mbox/%3CCA+=ewnb+tjv01fiyzsded3u5iyop3wcf1r3prhqtdjrm7ix...@mail.gmail.com%3E).
> JPA 2.1 is required the check the SPI (see
> http://java.dzone.com/articles/cdi-extensions-you-can-build,
> http://java.net/downloads/jpa-spec/JavaPersistencePFD.pdf,
> http://stackoverflow.com/questions/12951701/how-to-get-entity-manager-or-transaction-in-jpa-listener,
> http://stackoverflow.com/questions/11740322/cdi-injection-is-not-working-in-servlets).
> The CDI is a solid spec, we should start thinking about offering
> tapestry-cdi or similar as a core Tapestry module.
>
> Kalle
>
>
> On Thu, Aug 18, 2011 at 11:59 AM, Magnus Kvalheim <mag...@kvalheim.dk>wrote:
>
>> 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
>> >
>>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org

Reply via email to