2012-08-11 15 views
3

我有兩個應用程序在我的本地glassfish服務器上運行。一個租bicylces和一個買火車票。我現在想從列車應用程序中調用一個遠程ejb,以允許在選定時間租用自行車,但我不確定如何去做。我已經嘗試了幾種不同的方法。這兩個應用程序都在不同的包中,列車應用程序必須知道自行車遠程接口,但我不知道如何實現。如何從同一個GlassFish服務器上的其他應用程序注入EJB?

遠程接口(bicyle應用程序):

@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() { 
    } 

    ... 
} 

錯誤我得到的是一個沒有發現異常的類,我可以理解,因爲它是一個不同的應用程序,我的火車應用程序不知道「FahrradRe mote「,但我該如何注入該EJB?

+1

我認爲你需要包括含'FahrradRemote'類作爲你在哪裏注入它的其他應用程序的依賴罐子。 – Santosh 2012-08-11 18:06:18

+0

@Santosh我不這麼認爲,客戶端不應該需要它調用的類 - 有點違背了RMI的觀點。我不知道解決方案,但我希望沒有必要將字面上包含服務器端.class文件與客戶端... – Thufir 2014-09-13 07:11:38

回答

3

在自行車的應用程序,你必須:

  • interface FahrradRemote
  • 刪除@Remote註解@Remote註釋添加到您的FahrradServiceEJB

你可以按照這個片斷:

@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> 

當您部署自行車應用程序時,您的遠程EJB(我稱爲java:global/MyRemoteBeanModule/MyRemoteBean)的可移植JNDI名稱在GlassFish日誌中可用。

+2

如果OP 100%確定這兩個應用程序始終運行在同一個AS上,那麼可以使用lookup屬性而不是EJB註釋中的name屬性。這可以直接指定全局JNDI名稱。也許有趣的知道; EJB 3.2將標準化在同一個JVM中運行的跨應用程序EJB。 – 2012-08-13 17:53:14

0

你應該有一個FahrradService-EJB罐子和一個FahrradService-client罐子(名字是例子,只有兩個罐子)。如果您使用Jave EE插件/工具創建了一個EJB,那麼您的IDE將爲您生成。

您的EBJ jar和客戶端jar都將與其中一個應用程序打包在一起。應用程序的部署將建立EJB,因此它可以被引用,擡頭一看,注入等

的客戶機JAR將在用戶想通過@EJB或查找使用EJB任何其他應用程序被打包。

假設兩個應用程序都要部署到同一個應用程序服務器實例,它應該就是這麼簡單。

0

我們已經取得了在兩臺服務器同樣的例子工作:Glassfish的4.1.1和Websphere傳統8.5.5.5

在這兩種情況下,我們部署了兩個獨立的包:

  • 一戰與servlet ,
  • 和一個EJB的jar。

該servlet通過遠程接口使用@EJB注入EJB,沒有任何注入點參數。這在Glassfish中有效。 然而,使它在WebSphere的工作,我們必須包括在注入點@EJB以下明確的查詢(查詢= 「java的:全球/ 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();  
} 
相關問題