Please help with my code, why EntityManager and UserTransaction is always not injected, it's always null.
UserDAOImpl.java
package dao.implement;import dao.UserDAO;import java.util.List;import java.util.Optional;import javax.annotation.Resource;import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;import javax.transaction.UserTransaction;import model.Users;public class UserDAOImpl implements UserDAO { @PersistenceContext EntityManager em; @Resource UserTransaction utx; @Override public Optional<Users> findById(String id) { Users user = em.find(Users.class, id); return user != null ? Optional.of(user) : Optional.empty(); } @Override public Optional<Users> findByEmail(String email) { try { Users user = em.createNamedQuery("Users.findByEmail", Users.class) .setParameter("email", email) .getSingleResult(); return Optional.of(user); } catch (Exception e) { return Optional.empty(); } } @Override public List<Users> findAll() { return em.createNamedQuery("Users.findAll", Users.class).getResultList(); } @Override public void save(Users user) { try { utx.begin(); em.persist(user); utx.commit(); } catch (Exception ex) { System.out.println(ex); } } //...}
Test.java
import dao.implement.UserDAOImpl;import java.util.Optional;import model.Users;import static org.junit.Assert.assertTrue;import org.junit.Test;public class UserTest { private UserDAOImpl userDAO = new UserDAOImpl(); @Test public void testFindById() { System.out.println(userDAO.findById("123e4567-e89b-12d3-a456-426614174000")); } @Test public void testFindByEmail() { System.out.println(userDAO.findByEmail("test@example.com")); } //...}
It works when EntityManager is injected in the scope HTTPServlet class, but I want it to be instantiated in my DAO class. I just don't understand how the whole dependency injection thing in servlet works.
package controller;import java.io.IOException;import java.io.PrintWriter;import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet(name = "AuthController", urlPatterns = {"/auth"})public class AuthController extends HttpServlet { @PersistenceContext EntityManager em; //Injected, not null @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println(em); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println(em); }}