EJB注入和EntityManager都为null



我在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填充将不会被初始化。例如,如果它是Singletonbean,则添加注释:

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

@LocalBean

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

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

最新更新