Stateful bean, JNDI and Jboss WildFly



我读了一本关于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通常是无状态的,因为它们只持久存在。。。没有任何内部状态的实体。

最新更新