Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EJB参考配置_Java_Servlets_Jakarta Ee_Ejb - Fatal编程技术网

Java EJB参考配置

Java EJB参考配置,java,servlets,jakarta-ee,ejb,Java,Servlets,Jakarta Ee,Ejb,我目前正在开发我的第一个JavaEE应用程序,并且面临一些注入问题 对于我的项目,我使用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);

我目前正在开发我的第一个JavaEE应用程序,并且面临一些注入问题

对于我的项目,我使用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 … }
    
  • 我的服务很简单

    @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;
    
    我将此配置放在web.xml中,但它不起作用

    
    位置刀
    一场
    online.recruption.system.dao.dao
    
    首先,在使用
    @EJB
    注释进行注入时,不需要web.xml配置

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

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

    您应该定义一个扩展DAO的PositionDao接口,并且 将您的PositionDao重命名为PositionDaoImpl。然后,注入 而不是刀。事实上,我会放弃接口和 直接注入混凝土类。他们没给我们带来多少好处 桌子


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

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

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

    您应该定义一个扩展DAO的PositionDao接口,并且 将您的PositionDao重命名为PositionDaoImpl。然后,注入 而不是刀。事实上,我会放弃接口和 直接注入混凝土类。他们没给我们带来多少好处 桌子


    顺便说一句,您试图用EJB做的事情是不可能的。您应该定义一个扩展DAO的PositionDao接口,并将您的PositionDao重命名为PositionDaoImpl。然后,注入位置DAO而不是DAO。事实上,我会抛弃接口,直接注入具体的类。它们不会带来太多的好处。哎呀,你想用EJB做的是不可能的。您应该定义一个扩展DAO的PositionDao接口,并将您的PositionDao重命名为PositionDaoImpl。然后,注入位置DAO而不是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