Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.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 在POJO中使用EJB注入_Java_Jsf_Jakarta Ee_Ejb_Pojo - Fatal编程技术网

Java 在POJO中使用EJB注入

Java 在POJO中使用EJB注入,java,jsf,jakarta-ee,ejb,pojo,Java,Jsf,Jakarta Ee,Ejb,Pojo,我知道只有在EJB类、servlet或JSF管理的bean中才可能使用@EJB注释进行注入,但同时我需要在POJO类中拥有某个注入的业务接口的实例,因此我考虑执行以下操作: 在我的JSF托管bean中 @EJB BusinessInterfaceLocal businessInterface; private void someMethod(){ PojoInterface pojo = new PojoClass(this.businessInterface); } 在我的POJO

我知道只有在EJB类、servlet或JSF管理的bean中才可能使用@EJB注释进行注入,但同时我需要在POJO类中拥有某个注入的业务接口的实例,因此我考虑执行以下操作:

在我的JSF托管bean中

@EJB BusinessInterfaceLocal businessInterface;

private void someMethod(){
    PojoInterface pojo = new PojoClass(this.businessInterface);
}
在我的POJO类中,我有一个构造函数

BusinessInterfaceLocal businessInterface;    

public PojoClass(BusinessInterfaceLocal businessInterface){
   this.businessInterface = businessInterface;

   //The following throws a Null Pointer Exception
   this.businessInterface.someMethodCall();
}
难道上述操作不正确吗?但事实并非如此,PojoClass中的businessInterface对象被计算为null,因此引发null指针异常

我希望有人能指出我做错了什么


提前感谢。

验证

有没有可能在注入EJB之前创建PojoClass。我的意思是,你在哪里调用“someMethod”?它是否在托管bean的构造函数中?变量不会丢失其引用值

您说过可以在托管bean中看到BusinessInterfaceLocalbean不为null,您能在检查之后验证您是否创建了Pojo吗

替代解决方案:

解决方案1 您可以将POJO用作无状态bean,我认为这样做没有任何问题,当然,除非您试图在EE容器之外使用POJO,从外观上看,情况并非如此

使POJO无状态将使您能够注入EJB

解决方案2 或JNDI查找,实现如下:

@Stateless(name="myEJB")
public class MyEJB {

  public void ejbMethod() {
  // business logic
  }

}

public class TestEJB {

  public static void main() {
  MyEJB ejbRef = (MyEJB) new InitialContext().lookup("java:comp/env/myEJB");
  ejbRef.ejbMethod();
  }
}

对于上面显示的代码,如果托管bean中的
businessInterface
字段为null,则可以在指定行抛出
NullPointerException
。从一个对象传递到另一个对象时,引用不能神秘地变为null,
PojoClass
不会做任何会导致变量变为null的事情。我建议您进行一些调试或日志记录,以便在调用构造函数时确定托管bean中字段的值。如果为null,那么问题在于注入bean,而与POJO无关,您应该解决这个问题


如果抛出的异常实际上比您显示的行更深,那么这可能是在错误的上下文中使用EJB代理的问题。您可能知道,对EJB的引用通常不是对EJB本身的引用,而是对某种代理的引用,该代理将方法调用传递给EJB;代理的存在使得容器可以介入并执行诸如启动事务、检查授权等操作。代理可能需要调用某些上下文资源来执行其工作,这些资源在从托管bean访问EJB时可用,但由于某些不明显和扭曲的原因,不能从POJO访问EJB。这些资源的不可用可能导致
NullPointerException
。现在,我认为仅仅将一个引用从托管bean传递到POJO就不太可能让您陷入这种情况;只有在执行类似于从不同线程访问托管bean的操作时,才会发生这种情况。所以,可能不是这个

问题是因为我试图在构造函数中使用businessInterface对象,而容器仅在实例化托管bean之后注入ejb

对类似问题的提及

我所做的是创建了一个方法,并用@PostConstruct注释对其进行了注释,这样在容器实例化托管bean之后,将调用注释的方法,并且businessInterface对象不再为null

@PostContsruct
public void onInit(){
   //businessInterface is no longer null
   businessInterface.someMethod();
}

为了使注入正常工作,您需要用@Stateless之类的东西声明类,以便进行注入。您能提供整个类以便我们看到吗?问题不在于业务接口,因为我可以在其他地方使用它,它确实是用无状态注释注释的,它实现的接口是用本地注释的,但是当我尝试在普通类中的托管bean外部使用它时,会出现错误,
NullPointerException
到底是在哪里抛出的?是在你说的那一行,还是在堆栈中的某个更深的地方?是在那一行,我说,我调试了它,结果证明这个.businessInterface在POJO中被评估为null注入只有在POJO是容器管理的情况下才起作用!这意味着它必须通过@Inject进行实例化!new()的实例化不是容器管理的。使用您展示的代码,这是不可能发生的。请检查您的假设。如果您允许我进一步调查这个问题,我会尽快回复您,但我非常确定您所说的是最合理的,因为这是一个注入问题。事实上,我不能在托管bean中使用@EJB注入对象