EJB参考配置

时间:2015-12-28 21:36:25

标签: java servlets java-ee ejb

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

对于我的项目,我使用的是JPA,EJB和Servlets。 到目前为止,我创建了我的实体,通用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. 我的服务impl

    @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;
    
  6. 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>
    

1 个答案:

答案 0 :(得分:0)

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

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

最好是根据评论使用JB Nizet的建议:

  

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