【问题标题】:EJB3 beans JNDI lookup in Websphere 7Websphere 7 中的 EJB3 bean JNDI 查找
【发布时间】:2010-08-20 20:52:23
【问题描述】:

我创建了一个带有 web 项目、ejb3 项目和 ejb 客户端的 EAR。我可以通过 servlet 中的注入来调用 bean 方法。 我打算使用一个 ServiceDelegate 它是一个 pojo 来处理 bean 调用。所以我将从我的 servlet 调用委托,委托将调用适当的 bean 及其方法。

但我无法在 web 项目中的委托类中获取 bean 引用。 @EJB 注释返回一个空引用。所以我尝试使用 java:comp/env/EARname/BeanName 进行 JNDI 查找。但我总是以命名异常告终。

在上下文“java:”中找不到名称 comp/env/EARname。

请建议我在 Websphere 7 服务器上通过 JNDI 调用 ejb3 bean 的正确方法。

【问题讨论】:

    标签: java jakarta-ee ejb-3.0 jndi java-ee-5


    【解决方案1】:

    Java EE 5 和 6 中的依赖注入仅适用于托管类。在 servlet 容器中,少数类型的类支持这一点,而不是所有 POJO(不幸的是)。

    Servlet Spec 2.5 阐明了容器必须为其注入依赖项(如果存在)的类:


    组件类型:Servlet

    实现以下接口的类

    • javax.servlet.Servlet

    组件类型:过滤器

    实现以下接口的类

    • javax.servlet.Filter

    组件类型:监听器

    实现以下接口的类

    • javax.servlet.ServletContextListener
    • javax.servlet.ServletContextAttributeListener
    • javax.servlet.ServletRequestListener
    • javax.servlet.ServletRequestAttributeListener
    • javax.servlet.http.HttpSessionListener
    • javax.servlet.http.HttpSessionAttributeListener

    因此,如果您必须解决依赖查找的问题,您可以采用以下任一策略:

    • 将依赖项注入托管类,并将其传播到 ServiceDelegate。恕我直言,这是一种设计气味。
    • 使用 InitialContext 执行 JNDI 查找,但您应该注意为已部署的 EJB 生成的 JNDI 绑定。这似乎失败了,因为 JNDI 名称可能不正确 - Java EE 规范没有标准化分配给已部署 EJB 的 JNDI 名称。换句话说,鉴于缺乏可移植的 JNDI 名称,您应该尝试将 EJB 绑定到已知名称并执行相同的查找。
    • 您需要验证 EJB 会话对象是否确实绑定到 java:comp/env 命名空间。情况可能并非如此。需要明确的是,如果依赖项不是由容器注入,则必须在 web.xml 中声明本地 EJB 引用条目。容器不会自动将会话 EJB 对象注入 servlet 的命名空间;它将要求将 EJB 声明为托管类中的资源。这似乎是主要的失败案例,尽管它列在最后。

    【讨论】:

    • 请注意,anything 可以通过 CDI 在 Java EE 6 中转换为托管 bean。
    • 我面临同样的问题,不完全确定是否出于同样的原因我在这里问过stackoverflow.com/questions/6905186/…。你能解释一下你的观点吗?我仍然不确定我需要做什么。请看看我的问题,看看这是否相关。谢谢。
    猜你喜欢
    • 2011-08-08
    • 2011-11-26
    • 1970-01-01
    • 2010-12-04
    • 2013-06-29
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多