title: EJB 3.1 Generic DAO
body: <p>I am trying to implement a Generic DAO to use in my project. The code I have implemented thus far is the following:</p>
  
  <p><strong>Base DAO</strong></p>
  
  <pre><code>public abstract class BaseDAO&lt;T&gt; {
  
      private Class&lt;T&gt; entityClass;
  
      public BaseDAO(Class&lt;T&gt; entityClass) {
          this.entityClass = entityClass;
      }
  
      protected abstract EntityManager getEntityManager();
  
      public T persist(T entity) {
          getEntityManager().persist(entity);
          return entity;
      }
  
      public T edit(T entity) {
          getEntityManager().merge(entity);
          return entity;
      }
  
      public T remove(T entity) {
          getEntityManager().remove(entity);
          return entity;
      }
  
      public List&lt;T&gt; findAll() {
  
      Query q = getEntityManager().createQuery("SELECT e FROM " + entityClass.getName()
                  + " e");
          List&lt;T&gt; list = (List&lt;T&gt;) q.getResultList();
          return list;
      }
  
      public T find(Long id) {
          T e = getEntityManager().find(entityClass, id);
          return e;
      }
  
  }
  </code></pre>
  
  <p><strong>Extended DAO</strong></p>
  
  <pre><code>@Stateless
  public class CustomerDAO extends BaseDAO&lt;Customer&gt; {
  
      @PersistenceContext(unitName="customerPersistenceUnit")
      private EntityManager em;
  
      public CustomerDAO(Class&lt;Customer&gt; entityClass) {
              super(entityClass);
      }
  
      @Override
      protected EntityManager getEntityManager() {
          return em;
      }
  
  }
  </code></pre>
  
  <p><strong>The Controller Class</strong></p>
  
  <pre><code>@ManagedBean
  @RequestScoped
  public class CustomerController {
  
      @EJB
      private CustomerDAO customerDAO;
  
      private Customer customer;
      private List&lt;Customer&gt; list;
  
      @PostConstruct
      public void init() {
          customer = new Customer();
          list = customerDAO.findAll();
      }
  
      public void saveCustomer(ActionEvent event) {
  
          customer = customerDAO.persist(this.customer);
          list = customerDAO.findAll();
      }
  
      public Customer getCustomer() {
          return customer;
      }
  
      public void setCustomer(Customer customer) {
          this.customer = customer;
      }
  
      public List&lt;Customer&gt; getList() {
          return list;
      }
  
      public void setList(List&lt;Customer&gt; list) {
          this.list = list;
      }
  
  }
  </code></pre>
  
  <p>Everything seems to work perfectly when I use a Non-Generic DAO, however when I try out the Generic DAO I get the following exception:</p>
  
  <pre><code>SEVERE: EJB5070: Exception creating stateless session bean : [CustomerDAO]
  WARNING: EJB5184:A system exception occurred during an invocation on EJB CustomerDAO, method: public java.util.List example.BaseDAO.findAll()
  WARNING: javax.ejb.EJBException: javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB
      at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:454)
      at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:2547)
      at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1899)
      at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212)
      at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:89)
      at $Proxy216.findAll(Unknown Source)
      at example.__EJB31_Generated__CustomerDAO__Intf____Bean__.findAll(Unknown Source)
      at example.CustomerController.init(CustomerController.java:27)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:601)
      at org.glassfish.faces.integration.GlassFishInjectionProvider$2.run(GlassFishInjectionProvider.java:382)
      at java.security.AccessController.doPrivileged(Native Method)
      at org.glassfish.faces.integration.GlassFishInjectionProvider.invokeLifecycleMethod(GlassFishInjectionProvider.java:376)
      at org.glassfish.faces.integration.GlassFishInjectionProvider.invokePostConstruct(GlassFishInjectionProvider.java:306)
      at org.glassfish.faces.integration.GlassFishInjectionProvider.invokePostConstruct(GlassFishInjectionProvider.java:229)
      at com.sun.faces.mgbean.BeanBuilder.invokePostConstruct(BeanBuilder.java:223)
      at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:105)
      at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
      at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)
      at com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:244)
      at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:116)
      at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
      at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
      at com.sun.el.parser.AstIdentifier.getValue(AstIdentifier.java:103)
      at com.sun.el.parser.AstValue.getValue(AstValue.java:179)
      at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:224)
      at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
      at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
      at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
      at javax.faces.component.UISelectItems.getValue(UISelectItems.java:129)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:601)
      at com.sun.faces.facelets.util.DevTools.writeAttributes(DevTools.java:375)
      at com.sun.faces.facelets.util.DevTools.writeStart(DevTools.java:424)
      at com.sun.faces.facelets.util.DevTools.writeComponent(DevTools.java:245)
      at com.sun.faces.facelets.util.DevTools.writeComponent(DevTools.java:264)
      at com.sun.faces.facelets.util.DevTools.writeComponent(DevTools.java:264)
      at com.sun.faces.facelets.util.DevTools.writeComponent(DevTools.java:264)
      at com.sun.faces.facelets.util.DevTools.writeComponent(DevTools.java:264)
      at com.sun.faces.facelets.util.DevTools.writeComponent(DevTools.java:264)
      at com.sun.faces.facelets.util.DevTools.debugHtml(DevTools.java:128)
      at com.sun.faces.renderkit.RenderKitUtils.renderHtmlErrorPage(RenderKitUtils.java:1162)
      at com.sun.faces.context.ExceptionHandlerImpl.throwIt(ExceptionHandlerImpl.java:276)
      at com.sun.faces.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:142)
      at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
      at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
      at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
      at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
      at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
      at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
      at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
      at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
      at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
      at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
      at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
      at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
      at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
      at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
      at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
      at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
      at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
      at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
      at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
      at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
      at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
      at java.lang.Thread.run(Thread.java:722)
  Caused by: javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB
      at com.sun.ejb.containers.StatelessSessionContainer$SessionContextFactory.create(StatelessSessionContainer.java:726)
      at com.sun.ejb.containers.util.pool.NonBlockingPool.getObject(NonBlockingPool.java:247)
      at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:449)
      ... 74 more
  Caused by: javax.ejb.CreateException: Could not create stateless EJB
      at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java:534)
      at com.sun.ejb.containers.StatelessSessionContainer.access$000(StatelessSessionContainer.java:95)
      at com.sun.ejb.containers.StatelessSessionContainer$SessionContextFactory.create(StatelessSessionContainer.java:724)
      ... 76 more
  Caused by: java.lang.InstantiationException: example.CustomerDAO
      at java.lang.Class.newInstance0(Class.java:357)
      at java.lang.Class.newInstance(Class.java:325)
      at com.sun.ejb.containers.BaseContainer._constructEJBInstance(BaseContainer.java:1663)
      at com.sun.ejb.containers.BaseContainer.createEjbInstanceAndContext(BaseContainer.java:1646)
      at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java:475)
      ... 78 more
  </code></pre>