繁体   English   中英

EJB。 无法注入会话bean

[英]EJB. Cannot inject session bean

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

我做错了什么?

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

这需要特定的jndi手动查找,如果您以ejb开头,那么这是在获取ejb客栈之前最好的起点。

说:

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

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

请参阅此stackoverflow问题,以了解解决方法。

无法从Java SE客户端访问EJB-查找失败错误

您是否将客户端和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,您必须配置访问权限,请参见此处 部署bean之后,您可以在glassfish服务器的日志文件中找到JNDI名称。

您应该看看马塞斯在他的回答中说了什么。 另外,您不能将EJB注入静态字段,请参阅此问题以获取EJB规范的链接和引用以及为什么不允许使用它。

private static SessionBean sessionBean;

应该更改为

private static Session sessionBean;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM