JBoss - Сбой внедрения EntityManager - PullRequest
2 голосов
/ 09 февраля 2012

Я хочу использовать управляемую контейнером транзакцию в одном классе и делиться ею со своими подклассами.

Вот мой абстрактный класс:

@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);
    }
}

Сервлет, использующий его:

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);
        }
    }
}

Я получаю NPE, когда пытаюсь сохранить Ordre Чего мне не хватает?

JDK 6
JBoss 5.1.0.GA
JPA 1

1 Ответ

2 голосов
/ 09 февраля 2012

Ваш класс OrdreService POJO не управляется веб-контейнером, а также мне кажется, что это бесполезный дополнительный слой.Я бы использовал только OrdreDAO.

В любом случае, если вы хотите сохранить оба класса, сделайте OrdreService a Stateless EJB.Добавьте в OrdreService экземпляр OrdreDAO, используя:

@EJB private OrdreDAO dao;

Наконец, введите OrdreService в ваш сервлет, используя:

@EJB private OrdreService os;

Это должно работать.

...