EJB Injection
meetoblivion Jan 14, 2010 2:04 AMWe're using an abstract DAO class, along with an interface for it:
public abstract class AbstractDAO<E> { @PersistenctContext EntityManager em; public boolean save(E entity) { em.merge(entity); return true; } } public interface AbstractDAOBean<E> { public boolean save(E entity); }
I also created an implementation:
@Local public interface ResultDAOBean extends AbstractDAOBean<Result> { public Result findByUser(String username); } @DAO @Local(ResultDAOBean.class) @Stateless public ResultDAO extends AbstractDAO<Result> implements ResultDAOBean{ public Result findByUser(String username) { .... } }
Now, @DAO is a qualifier. I want to use this EJB in my classes, and I think I should be able to. So I add the following injection point to my code.
@Inject @DAO ResultDAOBean resultDAOBean;
No matter what combination I try, the exception reads along these lines:
Caused by: java.lang.IllegalStateException: Unable to convert ejbRef for ejb ResultDAO to a business object of type interface AbstractDAOBean at com.sun.ejb.containers.EjbContainerServicesImpl.getBusinessObject(EjbContainerServicesImpl.java:104) at org.glassfish.weld.ejb.SessionObjectReferenceImpl.getBusinessObject(SessionObjectReferenceImpl.java:60) at org.jboss.weld.bean.proxy.EnterpriseBeanProxyMethodHandler.invoke(EnterpriseBeanProxyMethodHandler.java:121) at jpa.dao.EvaluationDAOBean_$$_javassist_110.getEM(EvaluationDAOBean_$$_javassist_110.java) at NewSessionBean.init(NewSessionBean.java:30) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.sun.ejb.containers.interceptors.BeanCallbackInterceptor.intercept(InterceptorManager.java:1006) at com.sun.ejb.containers.interceptors.CallbackChainImpl.invokeNext(CallbackChainImpl.java:61) at com.sun.ejb.containers.interceptors.CallbackInvocationContext.proceed(CallbackInvocationContext.java:109) at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCallback(SystemInterceptorProxy.java:133) at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.init(SystemInterceptorProxy.java:115) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.sun.ejb.containers.interceptors.CallbackInterceptor.intercept(InterceptorManager.java:961) at com.sun.ejb.containers.interceptors.CallbackChainImpl.invokeNext(CallbackChainImpl.java:61) at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:390) at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:373) at com.sun.ejb.containers.AbstractSingletonContainer.createSingletonEJB(AbstractSingletonContainer.java:518) ... 38 more
So it looks like no matter what, Weld is trying to find the lowest interface rather than the local bean.