JBoss - EntityManager注入失败

时间:2012-02-09 02:51:41

标签: java java-ee jpa jboss ejb

我想在一个类中使用容器管理事务并与其子类共享它。

这是我的抽象类:

@TransactionManagement(TransactionManagementType.CONTAINER)
public abstract class AbstractDAO {
    @PersistenceContext(unitName = "myDS")
    protected EntityManager em;

    @Resource
    protected SessionContext context;

    protected Logger log;

    public AbstractDAO() {
        log = LoggerFactory.getLogger(this.getClass());
    }
}

其中一个孩子:

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class OrdreDAO extends AbstractDAO {
    public OrdreDAO() {

    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void persist(Ordre o) {
        em.persist(o);// NPE here ... no EntityManager injected !
    }

    @SuppressWarnings("unchecked")
    public List<Ordre> findAll() {
        Query q = em.createQuery("from Ordre");
        return q.getResultList();
    }
}

在这个孩子的顶部,OrdreService:

public class OrdreService {
    private OrdreDAO dao;

    public OrdreService() {
                dao=new OrdreDAO();
    }

    public void persist(Ordre o) {
        System.out.println("Service::persist  ??");
        dao.persist(o);
    }

    public List<Ordre> getOrdres() {
        return dao.findAll();
    }

    public Ordre getOrdre(String id) {
        return dao.findByPK(id);
    }

    public Ordre merge(Ordre o) {
        return dao.merge(o);
    }
}

使用它的servlet:

public class creerOrdre extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private OrdreService os;

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        try {
            System.out.println("création ordre");
            Ordre o = new Ordre();
            o.setDate(req.getParameter("date"));
            o.setMotif(req.getParameter("motif"));

            System.out.println("Ordre: " + o.getDate() + " " + o.getMotif());

                            OrdreService os = new OrdreService()
            if (os!=null) {
                System.out.println("NON null !");   
            }
            os.persist(o);

            resp.sendRedirect("visualiser.jsp");
        } catch (ParseException pe) {
            throw new ServletException(pe);
        }
    }
}

当我尝试坚持Ordre时,我得到了NPE 我错过了什么?

JDK 6
JBoss 5.1.0.GA
JPA 1

1 个答案:

答案 0 :(得分:2)

您的OrdreService POJO课程不是由网络容器管理的,而且在我看来,这是一个无用的附加图层。我只会使用OrdreDAO

无论如何,如果你想保留这两个课程,请OrdreService Stateless EJB。使用以下内容在OrdreService OrdreDAO实例中注入:

@EJB private OrdreDAO dao;

最后,使用以下命令在您的servlet中注入OrdreService

@EJB private OrdreService os;

这应该有用。