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

Mark Struberg (JIRA) issues at jboss.org
Tue Aug 26 05:07:03 EDT 2014

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

Mark Struberg commented on CDI-414:

Had an offline conversation with Martin. The real reason is not the interceptor but the check in Weld that you cannot inject itself in @Dependent scoped beans. Of course a SLSB is not _really_ @Dependent but this was only a hack to describe that CDI should not apply own proxies. But this triggers the aforementioned check in Weld. Which is not wrong from a plain spec perspective - but it is not really helpful.

In OWB we do not check for cyclic injection at all as there are just too many scenarios where it can happen.E.g A->B->A, A->B->C->A,... + all combinations with @PostConstruct, @Inject methods, @Inject constructors, etc. You will get a stackoverflow anyway if you do this. Not as nice a msg as in Weld, but we don't restrict constellations which are perfectly valid that way ;)

Please also note that the same might happen if you use @Scope scopes in Weld. Even if those non-299 scopes bring their own proxies, correct Martin?

> 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