我正在读一本关于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视图()
"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查找不返回任何内容。
答案 0 :(得分:0)
我认为你应该使用java:global /.../ JpaDAO来查找它 但我认为最好使用CDI注入来获取bean而不是显式查找。它还将为您提供bean实例,如果有任何更改,您将不必触摸查询bean的位置。
问题是为什么你为DAO使用有状态会话bean? DAO通常是无状态的,因为它们只是持久存在,......没有任何内部状态的实体。