我目前正在开发第一个Java EE应用程序,而且我遇到了一些注入问题。
对于我的项目,我使用的是JPA,EJB和Servlets。 到目前为止,我创建了我的实体,通用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 … }
我的服务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;
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>
答案 0 :(得分:0)
首先,当您使用@EJB
注释进行注入时,不需要web.xml配置。
其次,由于类型擦除,您无法使用EJB注入泛型类,您无法确定注入的EJB(DAO<Position>
)是否为预期类型,这将生成ClassCastException
在运行时。
最好是根据评论使用JB Nizet的建议:
你应该定义一个扩展DAO的PositionDao接口,和 将PositionDao重命名为PositionDaoImpl。然后,注入PositionDao 而不是DAO。事实上,我会抛弃接口和 直接注入具体课程。他们没有带来多少 表