シンプルな 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
- 明らかな何かを見逃しましたか?