我正在使用带有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动态应用程序,并且在那里一切正常。
请让我知道我做错了什么。谢谢。
答案 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
。