【问题标题】:EJB. Cannot inject session beanEJB。无法注入会话 bean
【发布时间】:2014-08-12 21:54:07
【问题描述】:

我有 EJB bean

界面:

package com.xlab.ice.ejb.sessionbean;
import javax.ejb.Remote;

@Remote
public interface Session {
    public String getMessage();
}

豆子:

package com.xlab.ice.ejb.sessionbean;
import javax.ejb.Stateless;

@Stateless
public class SessionBean implements Session {
    public SessionBean() {
    }
    public String getMessage() {
        return "Hello!";
    }
}

已成功部署到 Glassfhish 4。 但我无法通过简单的客户端访问它:

package com.xlab.ice.ejb.sessionbean;
import javax.ejb.EJB;

public class Client {

    @EJB
    private static SessionBean sessionBean;

    public void getMsg() {
        System.out.print(sessionBean.getMessage());
    }

    public static void main(String[] args) {
        new Client().getMsg();
    }
}

当我尝试通过以下方式运行它时:appclient -client SessionBeanClient.jar 我收到错误消息。 这是堆栈跟踪 - http://pastebin.com/JuHRcQp5

我做错了什么?

【问题讨论】:

    标签: java glassfish ejb


    【解决方案1】:

    您正在尝试通过独立客户端访问 ejb。

    这需要特定的 jndi 手动查找,如果您从 ejb 开始,最好在获得 ejb 的 inns 之前开始。

    也就是说:

    您需要知道部署 ejb 的主机和 CORBA 端口。

    创建初始上下文并进行手动查找。

    请参阅这个 stackoverflow 问题,了解如何去做。

    Cant access EJB from a Java SE client - Lookup Failed Error

    【讨论】:

      【解决方案2】:

      您是否将客户端和 bean 部署在同一台服务器上?与您不必使用接口相比,您可以使用“@LocalBean”注释您的 bean,因此可以从同一个 JVM 调用它。 对于您的问题:您需要按如下方式注入 bean:

      public class Client {
      
          @EJB
          private static SessionBean sessionBean;
          private final String jndiName = "java:global/find/this/out";
      
          public void getMsg() {
              InitialContext ctx = new InitialContext();
              sessionBean = (SessionBean) ctx.lookup(ejb_path);
              System.out.print(sessionBean.getMessage());
          }
      
          public static void main(String[] args) {
              new Client().getMsg();
          }
      }
      

      这仅适用于本地 bean,对于远程 bean,您必须配置访问权限,请查看 here。 部署 bean 后,您可以在 glassfish 服务器的日志文件中找到 JNDI 名称。

      【讨论】:

      • 我的客户端是独立的,正如我所提到的,我是这样开始的:appclient -client SessionBeanClient.jar。顺便说一句,据我所知,远程接口在 EJB 3.2 中是多余的
      • 我试过你的建议没有结果。我遇到了同样的错误。
      【解决方案3】:

      你应该看看maress 在他的回答中说了什么。此外,您不能将 EJB 注入静态字段,请参阅 this question 以获取对 EJB 规范的链接和引用以及为什么不允许这样做。

      【讨论】:

        【解决方案4】:
        private static SessionBean sessionBean;
        

        应该改为

        private static Session sessionBean;
        

        【讨论】:

        • 为什么会有任何改变?
        • 注入必须使用远程接口,而不是bean本身
        猜你喜欢
        • 2013-06-30
        • 1970-01-01
        • 2014-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-12
        相关资源
        最近更新 更多