EJB 注入在不同 类 中不起作用

EJB injection not working in different classes

我试图注入实体 EJB(来自 MySQL 数据库的外观和实体),但它不起作用,具体取决于它所在的 class。我使用 Rest webService 并且它在 webService class 中工作。 我使用多层架构,我不希望我的 EJB 被注入到这个 webService 中。

所以,这是@Stateless 外观:

public class ActivityEntityFacade extends AbstractFacade<ActivityEntity> {
@PersistenceContext(unitName = "persistance")
private EntityManager em;

@Override
protected EntityManager getEntityManager() {
    return em;
}

public ActivityEntityFacade() {
    super(ActivityEntity.class);
}

}

这是使用 EJB 的其余 webService 方法:

@EJB
private ActivityEntityFacade activityfacade;

@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/{date}")
public List<ActivityEntity> activities(@PathParam("date") String date){
    List<ActivityEntity> activityList = activityfacade.findAll();
    return activityList;
}

这是我的 activityManager,它应该与 EJB 一起工作并且应该 return 这个列表到另一层 :

public class ActivityManager implements Serializable, IActivity {

@EJB
private ActivityEntityFacade activityfacade;

public ActivityManager(){
}

public List<ActivityEntity> selectAll(){
    return  activityfacade.findAll();
}

}

此代码段 return activityEntityFacade 上的 nullPointerException。 你知道为什么它在这种情况下不起作用吗?

编辑: 上层创建activityManager实例:

 class ServActivityConsult implements IActivable{

@Override
public List<ActivityEntity> activityList() {
    IActivity managerActivity = new ActivityManager();
    return managerActivity.selectAll();
}

public ServActivityConsult(){
}

}

但在我们的例子中,错误来自 return activityfacade.findAll IN ActivityManager。

您正在使用 new ActivityManager() 自己创建 ActivityManager。因此 Java 的基本规则适用:调用构造函数,并且由于它不影响 activityfacade 的任何值,因此该字段设置为 null。

要实现依赖注入,您不能自己创建对象,而是从容器中获取它们。所以你的 class 应该看起来像

public class ServActivityConsult implements IActivable{

    @Inject
    private ActivityManager activityManager;

    @Override
    public List<ActivityEntity> activityList() {
        return activityManager.selectAll();
    }
}

而这个 class 本身应该注入 Jersey 控制器或 EJB。