【问题标题】:EJB injection and EntityManager are both nullEJB 注入和 EntityManager 都为空
【发布时间】:2019-04-03 19:43:02
【问题描述】:

我正在使用带有 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 类,我在其中注入了同样为 null 的 EntityManager。

@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 动态应用程序,它在那里一切正常。

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

【问题讨论】:

    标签: java jpa ejb


    【解决方案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

    【讨论】:

    • 我之前确实尝试过 unitName 而不是 name 但它不起作用。我以前只对 Web 应用程序使用过“名称”,然后它就可以工作了。 BookQueries 是一个控制器类,为什么它需要 EJB 类注解。我的 EJB 类是无状态会话 bean,即 BookService
    • 那么你是否有某个配置告诉它它是一个控制器或者类中缺少一些注释?
    • 没有。我不。我只是在 UI 类中创建这个类的一个对象,并将值传递给它。感觉这是我做错了什么。请解释我应该怎么做。
    猜你喜欢
    • 2011-12-15
    • 2016-01-30
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多