如何从同一GlassFish Server上的其他应用程序注入EJB?

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

远程接口(自行车应用程序):

@Remote public interface FahrradRemote { public List 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 available; private List stations; @EJB private BahnService service; @EJB(mappedName="FahrradService") private static FahrradRemote fahrradService; public BahnPM() { } ... } 

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

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

  • interface FahrradRemote删除@Remote注释
  • @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标签内部放置:

   BahnPM  FahrradService java:global/MyRemoteBeanModule/MyRemoteBean    

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

您应该有一个FahrradService-EJB jar和一个FahrradService-client jar(名称是示例,只有两个jar)。 如果使用Jave EE插件/工具创建EJB,则IDE将为您生成两者。

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

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

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

我们在两个服务器中使用了相同的示例: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(); }