2014-01-15 72 views
0

我想從使用JNDI查找的獨立JVM上運行的客戶端訪問遠程EJB3 bean。以下是我的bean類:如何使EJB3遠程接口可供客戶端使用?

@Path("/payment/") 
@Consumes({ "application/xml", "application/json" }) 
@Produces({ "application/xml", "application/json" }) 
@Local({ PaymentWebServiceLocal.class }) 
@Remote({ PaymentWebServiceRemote.class }) 
@Stateless(mappedName = "ejb/PaymentWebService") 
public class PaymentWebServiceImpl implements PaymentWebServiceLocal,PaymentWebServiceRemote { 

private static final Logger logger = Logger.getLogger(PaymentWebServiceImpl.class); 


@POST 
@Path("/processpayment") 
public PaymentResponse processPayment(PaymentRequest request) { 
    //do something 
} 

bean的遠程接口如下

@Remote 
public interface PaymentWebServiceRemote { 
    public PaymentResponse processPayment(PaymentRequest request); 
} 

現在,我使用JNDI來調用從遠程客戶端的processPayment()方法如下查找的EJB

Hashtable env = new Hashtable(); 
    env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); 
    env.put(Context.PROVIDER_URL, t3:\\); 
    Context ctx = new InitialContext(env); 
    return ctx.lookup("ejb.PaymentWebService#test.webservice.payment.service.PaymentWebServiceRemote"); 

我不明白的是客戶端不知道遠程PaymentWebServiceRemote接口。它在另一個具有EJB Bean代碼的服務器中。我是否也必須將此界面的副本也用於客戶端代碼?或者有什麼方法可以創建一個客戶端EJB jar,並在客戶端使用EJB3的遠程接口(就像我們在EJB2中那樣)?

任何幫助表示讚賞。

回答

1

您必須創建一個客戶端jar包含所有必要的接口以及可能傳遞給接口方法的參數類。

在您的例子,你需要把

  • VoidRemittanceService
  • VoidRemittanceServiceRemote
  • PaymentResponse

到客戶端罐子。

客戶端jar中不需要實現遠程接口的類。

當然你也可以製作一個副本並將它們放到客戶端項目中。但是這個 不是很好的做法,因爲你必須對界面進行兩次更改。 此外,您必須確保客戶端接口使用與服務器jar相同的JRE版本進行編譯。否則會出現問題。

好的做法是創建一個包含共享代碼的附加項目,這將被服務器和客戶端使用。該項目可以由服務器項目和客戶端項目引用。這樣共享代碼的改變直接影響服務器和客戶端。

+0

那麼,它與EJB2的工作方式類似嗎? – user3057702

+1

EJB2.1和EJB3.x都基於RMI/IIOP協議,因此它是相似的。 – Diversity

相關問題