我在GlassFish 5中使用eclipse。我正在使用swing制作一个三层应用程序。首先我做了一个JPA项目,然后添加了EJB Facet。正在使用实体类成功创建架构。
我在EJB注入和EntityManager注入中得到一个null。
在我的控制器中,我注入了如下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动态应用程序,在那里一切都很好。
请告诉我我做错了什么。非常感谢。
首先是后者,您的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()
那样做并不能使它得到管理,因此不会发生注入或类似的事情。您需要将它注释为已知的bean(或在Glassfish的控制面板或beans.xml中的某个位置配置它(。然后将它注入到一些托管上下文(UI类?(中,例如使用@Inject
或@Resource
,就像注入BookService
一样。
此外,我建议您检查是否应该使用@Inject
或@Resource
之类的注释,而不是@EJB
。