EJB。无法注入会话bean

时间:2014-08-12 21:54:08

标签: java glassfish ejb

我有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

我做错了什么?

4 个答案:

答案 0 :(得分:1)

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

这需要特定的jndi手动查找,如果你从ejb开始,那么在获得ejb的旅馆之前,这将是最好的起点。

那说:

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

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

请参阅此stackoverflow问题,了解如何进行此操作。

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

答案 1 :(得分:0)

您是否在同一台服务器上部署客户端和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名称。

答案 2 :(得分:0)

你应该看看maress在答案中所说的内容。此外,您不能将EJB注入静态字段,请参阅this question以获取EJB规范的链接和引用以及不允许的原因。

答案 3 :(得分:0)

private static SessionBean sessionBean;

应改为

private static Session sessionBean;