4

我在本地 glassfish 服务器上运行了两个应用程序。一辆租自行车,一辆买火车票。我现在想从火车应用程序中调用远程 ejb,以允许在所选时间租用自行车,但我不确定该怎么做。我已经尝试了几种不同的方法。两个应用程序都在不同的包中,火车应用程序必须知道自行车远程接口,但我不知道如何实现。

远程界面(自行车应用):

@Remote
public interface FahrradRemote {
    public List<Fahrrad> findAvaible(Date start, Date end);
    public void addAuftrag(Fahrrad fahrrad, Date startDate, Date endDate);
    public boolean login(String name, String passwort);
}

我想调用的自行车 EJB:

@Stateless(name="FahrradService",mappedName="FahrradService")
public class FahrradService implements javax.ejb.SessionBean, FahrradRemote, Serializable {

    @PersistenceContext
    private EntityManager em;
    Kunde customer;
...
}

火车应用程序的开始:

@Named
@SessionScoped
public class BahnPM implements Serializable {

    private String startStation;
    private String zielStation;
    private String loginName;
    private String loginPasswort;
    private String customerName;
    private String startDateString;
    private Date startDate;
    private List<Fahrt> available;
    private List stations;


    @EJB
    private BahnService service;

    @EJB(mappedName="FahrradService")
    private static FahrradRemote fahrradService;

    public BahnPM() {
    }

    ...
}

我得到的错误是找不到类的异常,我可以理解,因为它是一个不同的应用程序,我的火车应用程序不知道“FahrradRemote”,但我怎样才能注入那个 EJB?

4

3 回答 3

3

在您的自行车应用程序中,您必须:

  • @Remote您的interface FahrradRemote
  • @Remote注释添加到您的FahrradService EJB

你可以按照这个片段:

@Remote(FahrradRemote.class)
@Stateless
public class FahrradService implements FahrradRemote, Serializable {
    .... // your code 
}

(如果您使用的是 EJB 3.X,则无需 EJB 显式实现 SessionBean 接口)

在您的火车应用程序中:

@EJB(name="FahrradService") 
private FahrradRemote fahrradService;

(使用name属性而不是mappedName; 并且您不能在无状态 EJB 中拥有静态属性)

最后,您必须告诉容器在哪里查找 EJB 实现:创建描述符glassfish-ejb-jar.xml,并在glassfish-ejb-jar标签内放入:

<enterprise-beans>
  <ejb>
    <ejb-name>BahnPM</ejb-name>
    <ejb-ref>
      <ejb-ref-name>FahrradService</ejb-ref-name>
      <jndi-name>java:global/MyRemoteBeanModule/MyRemoteBean</jndi-name>
    </ejb-ref>
  </ejb>
</enterprise-beans>

java:global/MyRemoteBeanModule/MyRemoteBean部署自行车应用程序时,GlassFish 日志中提供了远程 EJB 的可移植 JNDI 名称(我称之为)。

于 2012-08-12T22:18:30.560 回答
1

我们在两台服务器上制作了相同的示例:Glassfish 4.1.1 和 Websphere Traditional 8.5.5.5

在这两种情况下,我们都部署了两个独立的包:

  • 与 servlet 的战争,
  • 还有一个带有 EJB 的 jar。

servlet 通过带有@EJB 的远程接口注入EJB,而注入点没有任何参数。这在 Glassfish 中有效。但是,为了使其在 Websphere 中工作,我们必须在注入点@EJB(lookup="java:global/ejbBasico/NewSessionBean")中包含以下显式查找

Glassfish Servlet 片段

/*imports omitted */
@WebServlet(name = "MiServlet", urlPatterns = {"/MiServlet"})
public class Servlet extends HttpServlet {

   @EJB
   private Interfaz miEjb;
   protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
       response.setContentType("text/html;charset=UTF-8");
       PrintWriter out = response.getWriter();
       try {
           out.println("Result: " + miEjb.businessMethod());
       } 
       finally {            
        out.close();
    }
 /*Additional servlet code not included*/
}

Glassfish EJB 片段

/*imports omitted */
@Stateless
public class NewSessionBean implements Interfaz {
    @Override
    public String businessMethod() {
        return("You've called the EJB");
    }
}

接口

/*imports omitted */
@Remote
public interface Interfaz {
    String businessMethod();     
}
于 2017-06-06T10:32:54.810 回答
0

你应该有一个FahrradService-EJB罐子和一个FahrradService-client罐子(名字是例子,只有两个罐子)。如果您使用 Jave EE 插件/工具创建了 EJB,那么您的 IDE 会为您生成两者。

您的 EBJ jar 和客户端 jar 都将与其中一个应用程序一起打包。应用程序的部署将建立 EJB,因此它可以被引用、查找、注入等。

您的客户端 jar 将被打包在任何其他想要通过 @EJB 或查找使用 EJB 的应用程序中。

假设两个应用程序都部署到同一个应用服务器实例,它应该就是这么简单。

于 2012-08-11T21:24:44.647 回答