私は EJB を初めて使用し、単純なステートレス セッション Bean を機能させようとしています。
これにはグラスフィッシュを使用しています。
私がやったこと:
インターフェイスを含むjarファイルを作成しました:
@Local
public interface SimpleStatelessBeanLocal {
public String getHello();
}
次に、次のクラスを含む EJB 用の war ファイルを作成しました (インターフェースを持つ jar への依存関係があります)。
@Stateless
public class SimpleStatelessSessionBean implements SimpleStatelessBeanLocal {
public String getHello() {
return "Hello from stateless session bean";
}
}
次に、単一のサーブレットと、インターフェースを備えた jar への依存関係を持つ Web アプリケーションを作成しました。
@WebServlet("/SimpleServlet")
public class SimpleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
InitialContext ctx;
try {
ctx = new InitialContext();
Object object = ctx.lookup("java:global/simple-stateless-session-bean/SimpleStatelessSessionBean");
response.getWriter().println(object);
Class c = object.getClass();
for (Class i : c.getInterfaces()) {
response.getWriter().println(i.getName());
}
response.getWriter().println(object instanceof SimpleStatelessBeanLocal);
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
これにより、次の出力が得られます。
be.sdutry.ejb.tests.stateless.simple.SimpleStatelessBeanLocal_253329002
com.sun.enterprise.container.common.spi.util.IndirectlySerializable
be.sdutry.ejb.tests.stateless.simple.SimpleStatelessBeanLocal
false
基本的にBeanを見つけ、そのインターフェースを実装しますが、現在のクラスローダーからのそのインターフェースのインスタンスではないため、キャストできません。
ここで私が間違っていることはありますか?リフレクション以外にこれを回避する方法が必要だと確信していますか?
私がすでに試したこと:私が見つけた投稿は、提供されたインターフェースを備えたjarを置くことを提案しましたが、代わりにClassNotFoundExceptionを取得しています。
使用:
- グラスフィッシュ4
- EJB 3.1