EJB注入和EntityManager都为null

时间:2018-10-30 17:32:03

标签: java jpa ejb

我正在使用带有GlassFish 5的Eclipse。我正在使用swing创建一个三层应用程序。首先,我创建了一个JPA项目,然后添加了EJB Facet。 使用实体类成功创建了架构。

我的EJB注入和EntityManager注入都为空。

在我的控制器中,我按如下所示注入了EJB:

public class BookQueries {

    @EJB
    private  BookService bs;

    public BookQueries() {
    /*try {

        Context context = new InitialContext();         
        Object fObj = context
            .lookup("java:global/LMS/BookService!com.lms.service.BookService");
        bs=(BookService)fObj;
    }catch(NamingException e) {
        System.out.println("Naming Exception while lookup of bean object");
    }
    */
}

正如您在控制器构造函数中看到的那样,我也尝试了JNDI查找,但是我仍然得到null。这是我的EJB类,其中有Injected EntityManager,它也是null。

@Stateless
@LocalBean
public class BookService {

    @PersistenceContext(name = "LMS")
    EntityManager em;

}

这是我的Persistence.xml文件

<persistence-unit name="LMS">   
    <jta-data-source>jdbc/lms</jta-data-source>
    <properties>
        <property name="eclipselink.ddl-generation"
                  value="drop-and-create-tables" />
    </properties>
</persistence-unit>

我以前在Eclipse上制作过Web动态应用程序,并且在那里一切正常。

请让我知道我做错了什么。谢谢。

1 个答案:

答案 0 :(得分:1)

首先是后者,您的BookService应该具有:

@PersistenceContext(unitName = "LMS") // not 'name'

或者如果没有其他PU使用,您可以尝试不使用任何unitName

然后关于您的BookQueries本身是否是托管bean,我看不到其中的任何与bean相关的注释?如果不是,则@EJB的东西将不会被初始化。例如,如果是Singleton bean,则添加注释:

@Singleton
@Startup  // makes it to be initialized at app startup

@LocalBean

new BookQueries()这样的操作不会使其得到管理,因此不会进行注入或发生此类事情。您需要对其进行注释(或在Glassfish的控制面板中的某个位置或在beans.xml中对其进行配置),以使其成为已知的bean。然后将其注入到某些托管上下文(UI类?)中,例如使用@Inject@Resource注入,就像注入BookService一样。

此外,我建议您检查是否应使用@Inject@Resource之类的注释,而不是@EJB