[weld-dev] CDI EJB Intergration on Weld

Jozef Hartinger jharting at redhat.com
Wed May 27 05:27:39 EDT 2015


No, proxies/subclasses should not be used for non-CDI interceptors. This 
depends on which InjectionTarget you use to produce the instances. There 
is a special method on InjectionTargetFactory that should be used to 
create InjectionTargets for non-CDI interceptors 
http://docs.jboss.org/weld/javadoc/2.2/weld-spi/org/jboss/weld/manager/api/WeldInjectionTargetFactory.html#createInterceptorInjectionTarget--

This special treatment is needed as otherwise the InjectionTarget would 
create a standard component instance (possibly intercepted), not 
intercepting.

On 05/27/2015 10:43 AM, Emily Jiang wrote:
> Will the injectionTarget.produce() produces a Weld proxy for the 
> non-CDI interceptors then? It seems ejb tck complains about the 
> proxied non-CDI interceptors. I looked at the cdi interceptors and I 
> think the instances are real objects not a proxy.
>
> What I meant of "correct constructor with the resolved arguments" is 
> that I directly call into the correct non-CDI interceptors and get a 
> real object instead of a proxy.
>
> On Wed, May 27, 2015 at 9:00 AM, Jozef Hartinger <jharting at redhat.com 
> <mailto:jharting at redhat.com>> wrote:
>
>     You can use InjectionTarget.produce() to create instances of
>     non-CDI interceptors as well. The implementation will call the
>     @Inject constructor passing in the dependencies or call the no-arg
>     constructor. What "correct constructor with the resolved
>     arguments" did you mean?
>
>     Jozef
>
>
>     On 05/27/2015 01:04 AM, Emily Jiang wrote:
>>     Thank you Jozef for your help with clarifying this!
>>
>>     By the way, for non-CDI interceptors, though EE7 spec lists these
>>     interceptors under the category of JavaEE component classes, I
>>     guess they are different from other other JavaEE component
>>     classes. For these interceptor instance creation, I guess we
>>     should not use injectiontarget.produce(). Am I right to say that
>>     we need to call into the correct constructor with the resolved
>>     arguments?
>>
>>     On Thu, May 21, 2015 at 1:25 PM, Jozef Hartinger
>>     <jharting at redhat.com <mailto:jharting at redhat.com>> wrote:
>>
>>         On 05/13/2015 12:35 AM, Emily Jiang wrote:
>>>         A further question on EJB injection,
>>>
>>>         In the Weld reference doc, performing injection on JavaEE
>>>         component class:
>>>         To help the integrator, Weld provides
>>>         WeldManager.fireProcessInjectionTarget() which returns the
>>>         InjectionTarget to use.
>>>
>>>         The statement was not mentioned when it talks about
>>>         performing injection on EJBs. My question is that do we need
>>>         to call the above method to fire the event.
>>         No, you only need to call this for non-contextual components.
>>         For session beans this is done by Weld automatically.
>>>
>>>         Another observation with the code snippet on EJB section. It
>>>         did not mention how the instance was created.  I think
>>>         'it.produce()' needs to be there before the it.inject().
>>>
>>>         // Obtain the EjbDescriptor for the EJB
>>>         // You may choose to use this utility method to get the
>>>         descriptor
>>>         EjbDescriptor<?> ejbDescriptor =
>>>         beanManager.getEjbDescriptor(ejbName);
>>>         // Get an the Bean object
>>>         Bean<?> bean = beanManager.getBean(ejbDescriptor);
>>>         // Create the injection target
>>>         InjectionTarget it =
>>>         deploymentBeanManager.createInjectionTarget(ejbDescriptor);
>>>         // Per instance required, create the creational context
>>>         CreationalContext<?> cc =
>>>         deploymentBeanManager.createCreationalContext(bean);
>>>
>>>         *.... missing the line... Object instance = it.produce()*
>>>         // Perform injection and call initializers
>>>         it.inject(instance, cc);
>>         Yes, looks like the line is missing.
>>
>>>
>>>         Thanks
>>>         Emily
>>>
>>>
>>>
>>>         On Fri, May 8, 2015 at 11:29 AM, Emily Jiang
>>>         <emijiang6 at googlemail.com <mailto:emijiang6 at googlemail.com>>
>>>         wrote:
>>>
>>>             Thank you Jozef for your helpful response! I have
>>>             another clarification on the interceptors on JavaEE
>>>             component classes.
>>>
>>>             EE7 spec states the JavaEE component classes, listed in
>>>             Table EE.5-1, need to support interceptors. Take servlet
>>>             for an example, which methods can be intercepted?
>>>
>>>             As the servlet classes are invoked by the container,
>>>             according to CDI1.2 spec, it seems only
>>>             service(ServletRequest, ServletResponse) can be
>>>             intercepted. No other methods can be intercepted.
>>>
>>>             Normally customer applications override doPost or doGet,
>>>             but they cannot be intercepted. I cannot see any value
>>>             of support interceptors on Servlet. Anything I missed?
>>>             Thanks
>>>             Emily
>>>
>>>             On Thu, May 7, 2015 at 8:22 AM, Jozef Hartinger
>>>             <jharting at redhat.com <mailto:jharting at redhat.com>> wrote:
>>>
>>>                 Hi Emily, comments inline.
>>>
>>>                 On 05/06/2015 05:38 PM, Emily Jiang wrote:
>>>>                 I have a few questions on ejb integration on Weld.
>>>>
>>>>                 1)Does Weld handle the instance creation for ejb
>>>>                 (using injectionTarget.produce) or delegate the
>>>>                 instance creation to EJB container? I guess Weld
>>>>                 will create the instead as it can manage
>>>>                 decorators. If not, how can decorators be managed?
>>>>                 Please confirm.
>>>                 Correct. Weld creates EJB instances using
>>>                 InjectionTarget.produce()
>>>>
>>>>                 2) When Weld creates the EJB instance, how can the
>>>>                 other non-CDI aroundconstruct interceptors (such as
>>>>                 the interceptors defined via ejb-jar.xml or
>>>>                 @Interceptors) be passed in? I found out the
>>>>                 WeldCreationContext and AroundConstructCallback but
>>>>                 I cannot find anything mentioned in the weld
>>>>                 reference doc. Is this the right plugin point?
>>>                 Correct, AroundConstructCallback is the API you need
>>>                 to use. The JavaDoc should be helpful. Let me know
>>>                 if anything is not clear. I'll add a note about it
>>>                 to the refdoc.
>>>>
>>>>                 3)If Weld creates the EJB instance, how can all
>>>>                 interceptors (cdi style and ejb style) be invoked?
>>>>                 Will the instance need to be passed back to EJB
>>>>                 container together with all CDI interceptors (get
>>>>                 hold of them via EjbEndpointServiceImpl.java) and
>>>>                 EJB container needs to manage the interceptors
>>>>                 being invoked?
>>>                 For interception type other than @AroundConstruct we
>>>                 leave it up to the EJB implementation to handle
>>>                 interception. Information about CDI interceptors is
>>>                 exposed to the EJB implementation via
>>>                 EjbServices.registerInterceptors()
>>>>
>>>>                 4)In Weld spec, it says you must register the
>>>>                 SessionBeanInterceptor as the inner most
>>>>                 interceptor in the stack for all EJBS. Can you
>>>>                 clarify what inner most means? Does this
>>>>                 interceptor need to be the first EJB interceptor to
>>>>                 be called or the last EJB interceptor to be invoked?
>>>                 Not sure why it says inner most - it should be outer
>>>                 most instead that is it should be called as first so
>>>                 that the @RequestScope is available for the other
>>>                 interceptors called later in the chain.
>>>>
>>>>
>>>>                 -- 
>>>>                 Thanks
>>>>                 Emily
>>>>                 =================
>>>>                 Emily Jiang
>>>>                 ejiang at apache.org <mailto:ejiang at apache.org>
>>>>
>>>>
>>>>                 _______________________________________________
>>>>                 weld-dev mailing list
>>>>                 weld-dev at lists.jboss.org  <mailto:weld-dev at lists.jboss.org>
>>>>                 https://lists.jboss.org/mailman/listinfo/weld-dev
>>>
>>>
>>>
>>>
>>>             -- 
>>>             Thanks
>>>             Emily
>>>             =================
>>>             Emily Jiang
>>>             ejiang at apache.org <mailto:ejiang at apache.org>
>>>
>>>
>>>
>>>
>>>         -- 
>>>         Thanks
>>>         Emily
>>>         =================
>>>         Emily Jiang
>>>         ejiang at apache.org <mailto:ejiang at apache.org>
>>
>>
>>
>>
>>     -- 
>>     Thanks
>>     Emily
>>     =================
>>     Emily Jiang
>>     ejiang at apache.org <mailto:ejiang at apache.org>
>
>
>
>
> -- 
> Thanks
> Emily
> =================
> Emily Jiang
> ejiang at apache.org <mailto:ejiang at apache.org>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/weld-dev/attachments/20150527/02f635d0/attachment-0001.html 


More information about the weld-dev mailing list