0

シンプルな Hello world タイプの EJB 2.1 アプリケーションを構築しようとしています。このアプリケーションの意図したランタイムは、Jboss 5.1.0 であると想定されています。これが私が書いたコードです。

EJB 構成ファイル:

ejb/TestEJBInterfaceBean com.TestEJB.TestEJBInterfaceHome com.TestEJB.TestEJBInterfaceRemote com.TestEJB.TestEJBInterfaceBean ステートレス コンテナ

ホームインターフェース:

import javax.ejb.EJBHome;

public interface TestEJBInterfaceHome extends EJBHome {
    public TestEJBInterfaceRemote create() throws java.rmi.RemoteException,
            javax.ejb.CreateException;
}

Remote Interface:

import java.rmi.RemoteException;
import javax.ejb.EJBObject;

public interface TestEJBInterfaceRemote extends EJBObject { 

    public String ping(String version) throws RemoteException;
}

豆クラス:

import java.rmi.RemoteException;
import java.util.Date;

import org.jboss.logging.Logger;

public class TestEJBIInterfaceBean extends BaseSessionBean implements TestEJBIInterfaceRemote{

    private static final long serialVersionUID = 1L;

    final Logger log = Logger.getLogger(TestEJBIInterfaceBean.class);   


    public String ping(String arg0) throws RemoteException {

        String response = this.getClass().getSimpleName() + " pinged @ " + new Date().getTime();

        log.info(response);
        return response;
    }

    public void ejbActivate() throws EJBException, RemoteException {
        // TODO Auto-generated method stub

    }

    public void ejbPassivate() throws EJBException, RemoteException {
        // TODO Auto-generated method stub

    }

    public void ejbRemove() throws EJBException, RemoteException {
        // TODO Auto-generated method stub

    }

    public void setSessionContext(SessionContext arg0) throws EJBException,
            RemoteException {
        // TODO Auto-generated method stub

    }

    public EJBHome getEJBHome() throws RemoteException {
        // TODO Auto-generated method stub
        return null;
    }

    public Handle getHandle() throws RemoteException {
        // TODO Auto-generated method stub
        return null;
    }

    public Object getPrimaryKey() throws RemoteException {
        // TODO Auto-generated method stub
        return null;
    }

    public boolean isIdentical(EJBObject arg0) throws RemoteException {
        // TODO Auto-generated method stub
        return false;
    }

    public void remove() throws RemoteException, RemoveException {
        // TODO Auto-generated method stub

    }

}

テスト クライアント:

public class TestEJBInterfaceClientTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            Context ctx = new InitialContext();

            TestEJBInterfaceRemote obj = (TestEJBInterfaceRemote)ctx.lookup("ejb/TestEJBInterfaceBean");

            System.out.println(obj.ping("12345"));

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

クライアントを実行すると、次のエラーが表示されます。

Exception in thread "main" java.lang.ClassCastException: $Proxy0 cannot be cast to com.TestEJB.TestEJBInterfaceRemote
    at TestEJBInterfaceClientTest.main(TestEJBInterfaceClientTest.java:21)

エラーはキャストが間違っていることを示唆しているようですが、キャストはエラーとは何の関係もないと思われます。(TestEJBInterfaceHome にキャストしようとしましたが、同じエラーが発生します)。私の疑いは、実際にはアプリケーションのバージョンにあります。

質問

  • Jboss がこれを EJB3 アプリケーションとして扱っている可能性はありますか? 構成ファイルを見ると、これが EJB2.1 であることを指定していないので、問題が発生している可能性がありますか?
  • ctx.lookup呼び出しから返された Type を調べる方法はありますか? 試してみましたgetClass().getNameが、返されるのはなどgetClass().getCanonicalName()の名前だけです。$proxy0, $proxy20
  • 明らかな何かを見逃しましたか?
4

1 に答える 1

2

EJB-3.0より前のルックアップの結果はホームインターフェイスなので、TestEJBInterfaceHome代わりにキャストしてみてください。移植性のために、ターゲットインターフェイスにキャストする前に、ctx.lookupの戻り値でPortableRemoteObject.narrowを使用する必要があることに注意してください。

実際の型はプロキシクラスなのでgetClass().getName()、正しいものを返します。クラスによって実装されているインターフェースを判別するには、を使用しますgetClass().getInterfaces()

于 2012-12-10T20:26:43.470 に答える