来自不同应用程序的java ee lookup ejbs

时间:2015-08-16 17:19:56

标签: rest java-ee ejb

Java EE教程根本没用。互联网搜索没有给人留下深刻印象。

我有一个EJB模块,它自己部署到glassfish。它有@Local和@Remote注释的iterfaces,它们都是由具体类实现的。

然后我有一个REST资源需要获取对该ejb模块的引用并调用一些方法。

你能给我一个准系统,简单的例子说明如何做到这一点?我的意思是,我甚至无法将SessionContext注入到我的应用程序中,因为它会崩溃...请保持简单。

ejb应该只有:

public String getMsg(){ 
    return "ohai";
}

休息服务:

@GET
@Produces("text/plain")
public String asd(){
    return <the myterious ejb that was injected somehow>.getMsg();
}

感谢。

1 个答案:

答案 0 :(得分:1)

好吧,我明白了。使用NetBeans,但可能适用于Eclipse。服务器 - glassfish

创建webapp,一个EJB - &gt;从webapp调用EJB。所有这些都在与单独模块相同的服务器内运行。

首先:创建一个EJB模块,它将自行部署:

远程接口:

package main;

import javax.ejb.Remote;

@Remote
public interface YourRemoteInterface{
     public String tellMeSomething();
     public void otherMethod(); //etc...
}

然后创建EJB实现类:

具体实施

package main;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.ejb.EJB; //crucial to JNDI lookup

@Remote(RemoteInterface.class)
@Stateless
@EJB(name="java:global:/MYSTUFF", beanInterface=YourRemoteInterface.class)
public class YourConcreteClass implements YourRemoteInterface{

     @Override
     public String tellMeSomething(){//...} //and do the other methods
}

@EJB name属性命名你的bean,你将用它来查找它。可以任何名字。例如:&#34; some-name&#34;,或&#34; java:global / YourConcreteClass&#34;

第二部分 - webapp: 对于Web应用程序,我使用了休息服务,但肯定可以是另一个EJB或SE客户端应用程序。对于SE客户端,您需要设置连接信息,但需要设置连接信息。

@Path("/somePath")
public class Service{

     @GET
     @Produces("text/plain")
     public String qwe(){
         try{
           javax.naming.InitialCOntext ic = new javax.naming.InitialContext();

           YourRemoteInterface rb = (YourRemoteInterface)ic.lookup("java:global:/MYSTUFF");
           return rb.tellMeSomething();

         } catch (Exception ex) {
              return "F*uck your life";
         }
     }
}

现在,从您的网络应用的项目属性,您需要:

1)将ejb jar文件添加到,以便在“编译”选项卡中显示。我使用了&#34;添加项目&#34;按钮

2)构建 - &gt;打包:将ejb jar文件添加到WAR内容中。我使用&#34;添加文件/文件夹&#34;,我导航到NetBeans项目/ EJB模块/ build / dist

注意:在尝试部署ejb或重新部署时可能会遇到错误。错误名称为: java.lang.RuntimeException:绑定JNDI名称main.RemoteInterface #main.RemoteInterface for EJB RemoteBean 时出错。跳过模糊的解释,为了治愈它,你需要在glassfish中执行一个命令:

asadmin set server.ejb-container.property.disable-nonportable-jndi-names =&#34; true&#34;

现在,您可以编译webapp并进行部署。应该工作。

最后这很简单。我发誓我已经在玻璃鱼教程中吃掉了整个ejb部分,他们没有告诉你这些东西。这太烦人了。