【问题标题】:EJB reference configurationEJB 参考配置
【发布时间】:2015-12-28 21:36:25
【问题描述】:

我目前正在开发我的第一个 Java EE 应用程序,并且遇到了一些注入问题。

对于我的项目,我使用 JPA、EJB 和 Servlet。 到目前为止,我创建了我的实体、通用 DAO、DAO 实现、服务、servlet 和一个 jsp 页面。

我想在我的 DAO 类中注入 JPA 实体管理器。 DAO 类被注入到服务中,服务被注入到 Servlet 中。

  1. 通用 DAO 接口

    @Local
    public interface DAO<T> {
        void insert(T item);
        void delete(T item);
    // and so on … }
    
  2. 通用 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… }
    
  3. 我的实体的通用 dao 扩展

    @Stateless
    @LocalBean
    public class PositionDAO extends GenericDAO<Position> {
        public PositionDAO() {
            super(Position.class);
        }
    }
    
  4. 我的位置实体服务接口

    @Local
    public interface PositionService {
        void addPosition(Position position);
        void updatePosition(Position position);
        // and so on … }
    
  5. 我的服务实现

    @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


【解决方案1】:

首先,不需要 web.xml 配置,因为您使用 @EJB 注释进行注入。

其次,由于类型擦除,您无法使用 EJB 注入泛型类,您无法确定注入的 EJB (DAO&lt;Position&gt;) 是否属于预期类型,这将在运行时生成 ClassCastException

你最好使用 JB Nizet 对每个 cmets 的建议:

您应该定义一个 PositionDao 接口来扩展 DAO,并且 将您的 PositionDao 重命名为 PositionDaoImpl。然后,注入 PositionDao 而不是 DAO。事实上,我会放弃接口和 直接注入具体类。他们没有带来太多 表

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-29
    • 2013-04-13
    • 2012-09-19
    • 1970-01-01
    • 2015-06-21
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多