2012-03-14 117 views
1

我正在嘗試EJB 3遠程方法訪問的示例。 一個簡單的例子,我在寫代碼並把它放在一個罐子裏。 我已經部署JBoss服務器裏面的罐子在C:\ jboss-4.2.3.GA \服務器\ DEFAULT \部署 和瓶子的名字是01addproject.jarEJB遠程方法訪問

(從Eclipse作爲EJB JAR文件導出)我正在使用另一個項目編寫客戶端代碼 以查找服務並以簡單的方式使用遠程方法。

我覺得這個類沒有被註冊到RMI註冊表中,當我將客戶端代碼作爲PSVM程序運行時,它給了NameNotFoundException。

這是錯誤:

javax.naming.NameNotFoundException: AddRemoteImpl not bound 
    at org.jnp.server.NamingServer.getBinding(NamingServer.java:529) 
    at org.jnp.server.NamingServer.getBinding(NamingServer.java:537) 
    at org.jnp.server.NamingServer.getObject(NamingServer.java:543) 
    at org.jnp.server.NamingServer.lookup(NamingServer.java:267) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:305) 

(減少空間不足)

封裝結構: Package Structre of both Client and EJB code

AddRemote.java

內部
package com.cluster.remote; 

import javax.ejb.Remote; 

@Remote 
public interface AddRemote { 

    void m1(); 
    int add(int x, int y); 

} 
代碼

代碼內AddRemoteImpl.java

package com.cluster.remote; 

import javax.ejb.Stateless; 

@Stateless 
public class AdddRemoteImpl implements AddRemote { 

    @Override 
    public void m1() { 
     System.out.println("inside m1"); 
    } 

    @Override 
    public int add(int x, int y) { 

     return x + y; 
    } 

} 

客戶端代碼(PSVM程序)內Client.java

package clientcode; 

import java.util.Hashtable; 

import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 

import com.cluster.remote.AddRemote; 

public class Client { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     try { 
      AddRemote remote = (AddRemote) getInitialContext().lookup("AddRemoteImpl/remote"); 

      System.out.println("The alue form the session bean is " + remote.add(3, 5)); 
      System.out.println("Added Successfully"); 



     } catch (NamingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


    } 

    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    public static Context getInitialContext() throws NamingException{ 

     Hashtable hashtable = new Hashtable(); 
     hashtable.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); 
     hashtable.put(Context.PROVIDER_URL, "localhost:1099"); 
     Context context = new InitialContext(hashtable); 


     return context; 
    } 

} 

回答

1

的EJB沒有導出在它已綁定的時間,因此它被序列化爲本身,而不是它的存根,所以客戶端查找無法加載AddRemoteImpl類,這是合理的,因爲客戶端應該沒有它。它建立/宣佈/部署的方式出了問題,無法進一步幫助。

+0

對不起。 它破解了! 一些愚蠢的錯誤。 類名是「AdddRemoteImpl」(參考封裝結構) 並在客戶端我打電話了「AddRemoteImpl /遠程」 .. 單「d」的區別.. 花了我一天...... @EJP ...感謝您在調試中的幫助。 – bali208 2012-03-15 16:09:07