[
https://issues.jboss.org/browse/CDI-414?page=com.atlassian.jira.plugin.sy...
]
Antonin Stefanutti commented on CDI-414:
----------------------------------------
In the [Metrics CDI
extension|https://github.com/astefanutti/metrics-cdi], CDI
interceptors are used to monitor bean method invocations. In the following use case, I
would expect the self-invocation of the annotated method to be intercepted as well:
{code}
import com.codahale.metrics.annotation.Timed;
public class TimedMethodBean {
@Timed(name = "timedMethod")
public void timedMethod() {
}
public void selfInvocationTimedMethod() {
timedMethod();
}
}
{code}
I gave it a try as I knew Weld is using subclassing as proxying technique though it
happens that interception of self-invocation bean method isn't working \[1\]. Besides,
neither the CDI nor the Java Interceptors specification make that point explicit. The only
reference to that question that I've been able to stumble upon is \[2\]:
{quote}
_Method interception_ by interceptors and decorators applies to _business method
invocations_ of a simple Web Bean, enterprise Web Bean or EJB bean.
...
Self-invocations of a simple Web Bean are considered to be business method invocations.
However, self-invocations of an enterprise Web Bean or EJB session, singleton or message
driven bean are not considered to be business method invocations.
{quote}
From my understanding, valid use cases exist, implementations are
capable of supporting it (OWB uses bytecode manipulation \[3\]), yet it has been
"disabled" for consistency with EJB which contradicts \[2\]. That'd be
valuable to have that cleared explicitly in the upcoming CDI 2.0 specification as Antoine
suggested.
\[1\]:
https://github.com/astefanutti/metrics-cdi/blob/4625ce1e75b2651935287d1c2...
\[2\]:
http://docs.jboss.org/webbeans/spec/PDR/html/interceptors.html
\[3\]:
https://blogs.apache.org/owb/entry/news_from_openwebbeans_1_2
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
(v6.2.6#6264)