【发布时间】:2015-12-28 21:36:25
【问题描述】:
我目前正在开发我的第一个 Java EE 应用程序,并且遇到了一些注入问题。
对于我的项目,我使用 JPA、EJB 和 Servlet。 到目前为止,我创建了我的实体、通用 DAO、DAO 实现、服务、servlet 和一个 jsp 页面。
我想在我的 DAO 类中注入 JPA 实体管理器。 DAO 类被注入到服务中,服务被注入到 Servlet 中。
-
通用 DAO 接口
@Local public interface DAO<T> { void insert(T item); void delete(T item); // and so on … } -
通用 DAO 实现
public class GenericDAO<T> implements DAO<T> { @PersistenceContext(unitName = "MyPU") private EntityManager entityManager; private final Class<T> entityClass; public GenericDAO(Class<T> entityClass) { this.entityClass = entityClass; } @Override public void insert(T item) { entityManager.persist(item); } // and so on… } -
我的实体的通用 dao 扩展
@Stateless @LocalBean public class PositionDAO extends GenericDAO<Position> { public PositionDAO() { super(Position.class); } } -
我的位置实体服务接口
@Local public interface PositionService { void addPosition(Position position); void updatePosition(Position position); // and so on … } -
我的服务实现
@Stateless @LocalBean public class PositionServiceImpl implements PositionService { @EJB private DAO<Position> positionDao; @Override public void addPosition(Position position) { positionDao.insert(position); } // and so on… @WebServlet(name = "RegisterServlet", urlPatterns = {"/register"}) public class RegisterServlet extends HttpServlet { @EJB PositionService positionService;
Cannot resolve reference Local ejb-ref name=online.recruitment.system.service.PositionServiceImpl/positionDao,Local 3.x interface =online.recruitment.system.dao.DAO,ejb-link=null,lookup=,mappedName=,jndi-name=,refType=Session
我将此配置放在我的 web.xml 中,但它不起作用
<ejb-local-ref>
<ejb-ref-name>positionDao</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local>online.recruitment.system.dao.DAO</local>
</ejb-local-ref>
【问题讨论】:
-
AFAIK,EJB 无法实现您想要做的事情。您应该定义一个扩展 DAO
的 PositionDao 接口,并将您的 PositionDao 重命名为 PositionDaoImpl。然后,注入 PositionDao 而不是 DAO 。事实上,我会放弃接口并直接注入具体的类。他们并没有带来太多好处。
标签: java servlets jakarta-ee ejb