[cdi-dev] [JBoss JIRA] (CDI-414) Support for "self" injection

Jozef Hartinger (JIRA) issues at jboss.org
Tue Aug 12 07:50:30 EDT 2014

    [ https://issues.jboss.org/browse/CDI-414?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12992248#comment-12992248 ] 

Jozef Hartinger commented on CDI-414:

Yes, Weld does not intercept self invocations. My comment only said that it would be technically possible to support it without much trouble. 

You are quoting an outdated version of the specification. The relevant quotes would be:

{quote}When the application invokes:
• a method of a bean via a contextual reference to the bean, as defined in Section 6.5.3,“Contextual reference for a bean”, or
• a method of a bean via a non-contextual reference to the bean, if the instance was created by the container (e.g. using InjectionTarget.produce() or  UnmanagedInstance.produce()), or
• a business method of a session bean via an EJB remote or local reference, 
the invocation is treated as a *business method invocation*.

{quote}If, and only if, an invocation is a *business method invocation* it passes through method interceptors and decorators{quote}

{quote}Otherwise, the invocation is treated as a normal Java method call and is not intercepted by the container.

> Support for "self" injection
> ----------------------------
>                 Key: CDI-414
>                 URL: https://issues.jboss.org/browse/CDI-414
>             Project: CDI Specification Issues
>          Issue Type: Bug
>          Components: Resolution
>            Reporter: arjan tijms
> Many features of CDI and EJB work by means of a proxy that intercepts calls and adds 'aspects'. In Java it's however not possible to decorate the {{this}} pointer, so methods called on the same bean instance from within a method in the bean do not get their 'aspects' applied.
> This is a well known limitation, but in EJB it's possible to work around this by injecting a bean into itself. E.g.
> {code}
> @Stateless
> public class Foo {
>     @EJB
>     private Foo self;
>     // ...
> }
> {code}
> Also see http://adam-bien.com/roller/abien/entry/how_to_self_invoke_ejb
> Unfortunately using CDI and {{@Inject}} this doesn't work. Weld for instance fails the deployment and logs:
> {noformat}
> WELD-001443 Pseudo scoped bean has circular dependencies.
> {noformat}
> See also: http://adam-bien.com/roller/abien/entry/inject_vs_ejb
> Although there are workarounds, it would be great if {{@Inject}} in combination with CDI could support self injection as well.
> With that projects migrating from {{@EJB}} to {{@Inject}} can do so more easily and the capability can be convenient for new projects as well (e.g. calling two separate {{@Transactional}} methods from a single method without being required to create a new bean).

This message was sent by Atlassian JIRA

More information about the cdi-dev mailing list