title: Injecting EntityManager with a producer in tomcat
body: <p>I am running a project using Hibernate and Weld CDI on tomcat 7.  I have write a ServletContextListener to create the EntityManagerFactory and  EntityManager during application startup.</p>
  
  <pre><code>public class PersistenceListener implements ServletContextListener {
  
       private static EntityManagerFactory entityManagerFactory;
  
       public void contextInitialized(ServletContextEvent sce){
       ServletContext context = sce.getServletContext();
       entityManagerFactory = Persistence.createEntityManagerFactory("hibernate-test");
       }
  
       public void contextDestroyed(ServletContextEvent sce) {
       entityManagerFactory.close();
       }
  
  
       public static EntityManager createEntityManager() {
              if (entityManagerFactory == null) {
                  throw new IllegalStateException("Context is not initialized yet.");
              }
  
              return entityManagerFactory.createEntityManager();
          }
  
  }
  </code></pre>
  
  <p>I can use my entityManager in my test class (it is an arquillian test class)  simply by creating it through the following code</p>
  
  <pre><code>EntityManager em = PersistenceListener.createEntityManager();
                 em.getTransaction().begin();
                     em.createQuery("delete from Game").executeUpdate();
                     em.getTransaction().commit();
  </code></pre>
  
  <p>here is the complete code for my test class</p>
  
  <pre><code>    @RunWith(Arquillian.class)
      public class HibernateTestSample {
  
             @Deployment
             public static WebArchive createTestArchive()
             {
                 MavenDependencyResolver resolver = DependencyResolvers.use(
                          MavenDependencyResolver.class).loadMetadataFromPom("pom.xml");
  
                 WebArchive webArchive=  ShrinkWrap
                      .create(WebArchive.class, "ROOT.war")
                      .addClasses(CdiTestBean.class,HibernateListener.class,PersistenceListener.class)
                      .addAsLibraries(
                                  resolver.artifact("org.jboss.weld.servlet:weld-servlet")
  //                              .artifact("org.hibernate.javax.persistence:hibernate-jpa-2.0-api")
                                  .artifact("org.apache.tomcat:tomcat-dbcp")
                                  .artifact("org.hibernate:hibernate-entitymanager")
                                  .artifact("org.hibernate:hibernate-validator")
                                  .artifact("org.hibernate:hibernate-core")   
                                  .artifact("com.h2database:h2")
                                  .artifact("mysql:mysql-connector-java")
                                  .resolveAs(GenericArchive.class))
  
                      .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml")
                      .addAsWebInfResource("test-persistence.xml", "classes/META-INF/persistence.xml")
                      .addAsWebInfResource("hibernate.cfg.xml", "classes/hibernate.cfg.xml") 
  //                  .addAsWebInfResource("context.xml", "classes/META-INF/context.xml")
                      .addAsManifestResource("context.xml", "context.xml")
                      .setWebXML("hibernate-web.xml");
                System.out.println(webArchive.toString(true));
  
                return webArchive;
             }
  
  
             @Test
             public void myTest()
                     throws Exception {                                                      
  
                 EntityManager em = PersistenceListener.createEntityManager();
                 em.getTransaction().begin();
                         em.createQuery("delete from Game").executeUpdate();
                     em.getTransaction().commit();
                    ...............
                        .......
                        ...
  
  
             }
      }
  </code></pre>
  
  <p>but I want to inject my entityManager to my class. I read <a href="https://stackoverflow.com/questions/4708035/persistencecontext-entitymanager-injection-nullpointerexception">in an other post</a>    that I cannot use  @PersistenceContext in my class, therefor I decided to use a producer to inject my entity manager. but it doesn't work for my, please tell me what am i doing wrong here (I am quite new in CDI )</p>
  
  <p>here is my new ServletContextListener</p>
  
  <pre><code>public class PersistenceListener implements ServletContextListener {
  
       private static EntityManagerFactory entityManagerFactory;
  
       @Produces
       private EntityManager entityManager;
  
       public void contextInitialized(ServletContextEvent sce){
       ServletContext context = sce.getServletContext();
       entityManagerFactory = Persistence.createEntityManagerFactory("hibernate-test");
       createEntityManager();
       }
  
       public void contextDestroyed(ServletContextEvent sce) {
       entityManagerFactory.close();
       }
  
  
       public void createEntityManager() {
              if (entityManagerFactory == null) {
                  throw new IllegalStateException("Context is not initialized yet.");
              }
  
              this.entityManager =  entityManagerFactory.createEntityManager();
          }
  </code></pre>
  
  <p>and I am injecting in my testclass</p>
  
  <pre><code>@Inject
  private EntityManager em;
  </code></pre>
  
  <p>It is null</p>