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。
我试图注入实体 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。