我读了一本关于EJB 3.0的书,书中说应该使用JNDI查找有状态会话bean。
我有一个有状态会话bean,如下所示:
@Local
@Stateful
public class JpaDao {
@PersistenceContext(unitName="EmployeeService")
EntityManager em;
public EntityManager getEntityManager() {
return em;
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void addEmployee(String name, String lastName) {
Customer cust = new Customer();
.....................
....
在JSF管理的bean中,我做了如下操作:
Context ctx = new InitialContext();
JpaDao jpa = (JpaDao)ctx.lookup("java:comp/env/JpaDao");
但它什么也没找到。为什么会这样?
我打开wildfly cli客户端,看到jndi树:子系统=命名:jndi-view()
"applications" => {
"JavaServerFaces-1.0.war" => {
"java:app" => {
"AppName" => {
"class-name" => "java.lang.String",
"value" => "JavaServerFaces-1.0"
},
"env" => {
"class-name" => "org.jboss.as.naming.NamingContext",
"value" => "env"
},
"JavaServerFaces-1.0" => {
"class-name" => "javax.naming.Context",
"children" => {
"JpaDao" => {
"class-name" => "com.deluxe.common.dao.JpaDao",
"value" => "?"
},
"JpaDao!com.deluxe.common.dao.JpaDao" => {
"class-name" => "com.deluxe.common.dao.JpaDao",
"value" => "?"
}
}
}
},
"modules" => undefined
},
它确实显示了JpaDao的一个条目,以及为什么JNDI查找不返回任何内容。
我认为您应该使用java:global//JpaDAO但我认为最好使用CDI注入来获得bean,而不是显式查找。它还将为您提供bean实例,如果发生任何更改,您不必触摸查询bean的位置。
问题是,为什么要在DAO中使用有状态会话bean?DAO通常是无状态的,因为它们只持久存在。。。没有任何内部状态的实体。