【问题标题】:JBoss - EntityManager Injection FailedJBoss - EntityManager 注入失败
【发布时间】:2012-03-01 13:31:29
【问题描述】:

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

这是我的抽象类:

@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

【问题讨论】:

  • 为什么要在抽象类上提供@Stateless ?你可以从那里删除它并测试
  • 我不确定您的代码为什么不起作用。我可以告诉您的是,NetBeans 生成的服务外观类与您所做的完全一样,唯一的区别是 EntityManager 被注入到子类中。它可以工作(至少在 GlassFish 3 上)。 netbeans.dzone.com/nb-generate-simpler-rest
  • 我已经用我的一些代码更新了我的帖子

标签: java jakarta-ee jpa jboss ejb


【解决方案1】:

您的 OrdreService POJO 类不由 Web 容器管理,而且在我看来它是一个无用的附加层。我只会使用OrdreDAO

无论如何,如果您想同时保留这两个课程,请将 OrdreService 设置为 Stateless EJB。使用 OrdreService 注入 OrdreDAO 实例:

@EJB private OrdreDAO dao;

最后,在您的 servlet 中注入 OrdreService

@EJB private OrdreService os;

这应该可行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-25
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 2011-11-07
    • 2011-05-07
    相关资源
    最近更新 更多