java - JBoss - EntityManager 注入(inject)失败

标签 java jakarta-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());
    }
}

它的一个 child :

@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

最佳答案

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

无论如何,如果您想保留这两个类,请将 OrdreService 设为 Stateless EJB。使用以下方法在 OrdreService 中注入(inject) OrdreDAO 实例:

@EJB private OrdreDAO dao;

最后,使用以下方法在您的 servlet 中注入(inject) OrdreService:

@EJB private OrdreService os;

这应该有效。

关于java - JBoss - EntityManager 注入(inject)失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9204761/

相关文章:

java - 如何使用 for 循环创建一个正方形

mysql - hibernate sql join查询错误: javax. servlet.ServletException:对于输入字符串

java - 为什么我的 hibernate 关系不起作用?

java - 使用流过滤器的实体在带有 TomEE 的 OpenJPA 上产生 StringIndexOutOfBoundsException

java - 从文件中读取。安卓、Java

Java 引用变量

java - 使用 jpa 从子查询中选择时出错

java - 在集合上循环时 Hibernate 删除 session

java - 椭圆形 - 具有不同消息的多个 ValidateWithMethod/复杂自定义验证?

java - Java EE 是否在 Java SE 的 JRE 上运行?