繁体   English   中英

Ejb返回java.lang.NullPointerException

[英]Ejb returns java.lang.NullPointerException

我是cdi的新手,这是我的第一步。 我在ejb模块中有一个bean:

@Stateless
public class TestBean {
    public String getIt(){
        return "test";
    }
}

我在战争模块中有一个POJO(我试过@EJB和@Inject - 相同的结果)

public class SaveAction  extends Action{
    @EJB    
    private TestBean bean;

    @Override
    public void execute(){
    ....    
    String test = bean.getIt(); //HERE I GET java.lang.NullPointerException
    ...
    }
}

战争和ejb都在耳内。 在日志我看到

EJB5181:EJB TestBean的可移植JNDI名称:[java:global / example.com / my-ejb / TestBean!com.example.TestBean,java:global / example.com / my-ejb / TestBean]]]

从那里我得出结论bean被初始化 - 但我找不到它。 我究竟做错了什么?

CDI和其他依赖注入容器不使用魔法! 它只是普通的java代码,它不能比任何其他任何地方编写的java代码做得更多或更少。 因此,当一个对象直接通过new实例化时,框架不可能进行注入:

SaveAction action = new SaveAction();
// don't expect any injection has happened - it can't! no magic!
// action.bean is still null here!

框架不知道像SaveAction这样的对象已被实例化。 (因此有必要以某种方式告知框架有关新创建的对象 - 但是构造函数和'new'语句都没有这样做!只想一下如何编写这样的框架代码!这是不可能的!*) 。

要使注入工作,必须由容器创建对象! 否则它不受管理! (另见Web Bean规范的第3.7章(JSR 299) )。

执行此操作的最佳方法是让容器将对象注入另一个已管理的bean。 这似乎只是解决了这个问题,但是你的应用程序中有一些已经托管的bean,比如servlet!

建议:让你的SaveAction CDI知道(例如用@Default注释)并将它注入你的servlet!

教程:


*)理论上应该可以使用面向方面的编程或检测来操作bean的构造函数,以便在调用它们时通知容器。 但这是一个非常复杂的概念,我认为有许多未解决的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM