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