0

私は 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
4

1 に答える 1

0

私はそれを機能させることができました。主な問題は、SLSB を使用するコードが同じ EAR ファイルにないため、SLSB をリモートにする必要があることでした。

私がやった方法:

インターフェイスのみを含む Jar:

public interface SimpleStatelessBeanCommon {
    public String getHello();
}

@Local
public interface SimpleStatelessBeanLocal extends SimpleStatelessBeanCommon{
}

@Remote
public interface SimpleStatelessBeanRemote extends SimpleStatelessBeanCommon{
}

War を含む Bean 実装 (インターフェースを持つ jar に依存)

@Stateless
public class SimpleStatelessSessionBean implements SimpleStatelessBeanLocal, SimpleStatelessBeanRemote {
    public String getHello() {
        return "Hello from stateless session bean";
    }
}

Bean を使用した戦争 (インターフェースを備えた jar への依存関係あり)

@WebServlet("/SimpleServlet")
public class SimpleServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @EJB
    SimpleStatelessBeanRemote simpleStatelessSessionBean;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().println(simpleStatelessSessionBean.getHello());
    }
}

fvuが投稿したものをまだ見ていきます。

最適化の提案やコメントは引き続き歓迎します。

于 2013-11-15T10:28:00.110 に答える