Details
-
Bug
-
Resolution: Can't Do
-
Major
-
None
-
1.1.2.Final
-
None
-
None
Description
In the following code I'm trying to inject a SessionScoped bean into a stateless EJB,
but I want to do the @Inject in an abstract base class of the EJB. According to the
CDI spec it seems to suggest that this should work:
"4.2. Inheritance of member-level metadata
Suppose a class X is extended directly or indirectly by the bean class of a managed bean or session bean Y.
If X declares an injected field x then Y inherits x."
What happens is that I can access the inherited protected member sessionView from TestEjb,
but not from code within the base class. When I say "can access", I mean that the injected
member is accessible at runtime and is not null.
@Named
@ViewAccessScoped
public class JsfBean extends implements Serializable {
@Inject private TestEjb ejb;
SessionView s1 = ejb.getSessionViewChild(); // sessionView injected ok
SessionView s2 = ejb.getSessionViewBase(); // s2 is null
}
@Named
@SessionScoped
public class SessionView implements Serializable {}
@Stateless
public class TestEjb extends BaseClass implements Serializable {
public SessionView getSessionViewChild()
{ return sessionView; }
}
public abstract class BaseClass implements Serializable {
@Inject
protected SessionView sessionView;
public SessionView getSessionViewBase()
{ return sessionView; }
}
What happens is that s1 is a valid SessionView reference, but s2 is null. It now
turns out that if I change the access of sessionView in BaseClass to private, it
works, but only if I clean & build before re-deployment. It will then consistently
work - unless I change it back to protected, in which case it will consistently not
work.
I am using MyFaces CODI 1.0.1 in conjunction with Weld from Glassfish 3.1.1
(v20110404-1554). I am also using JDK 7u1. I reported this on the MyFaces mailing
list but Gerhard said this looked like a weld issue.
Thanks.