1

@EJBアノテーションを使用してEJB(3.0)を挿入するRESTfulサービスがあります。Beanでgreeting()メソッドにアクセスしようとすると、NullPointerExceptionが発生するため、このインジェクションは機能しません。

この正確なコードはGlassfish3.1で機能しますが、WAS8.0.2では失敗します。ただし、まったく同じアプローチを使用してサーブレットから参照された場合、インジェクションは同じアプリケーションで機能します

@Stateless
@Path("/hello")
public class HelloRestService {

@EJB
public HelloInterface helloImpl;

}

私の豆はこんな感じ

package impl;

@Stateless
@Local
public class HelloImpl implements iface.HelloInterface {

@Override
public String greeting() {

    return "Hello developer";
}

}

サーバーの起動時に出力されるjndi名を使用して、実装のルックアップを実行しようとしました

helloimpl = (HelloImpl) new InitialContext().lookup("java:global/REST_EAR/REST_WAR/HelloImpl!iface.HelloInterface");

ただし、これによりClassCastExceptionが発生します

java.lang.ClassCastException: iface.EJSLocal0SLHelloImpl_f8ca883b incompatible with impl.HelloImpl

私はこれをたくさん読むことができますか..?

現在、JAX-RS1.1の実装としてWinkを使用しています。以前にJerseyを使用したことがあり、同じ結果が得られました。

これがJAX-RS/WASの問題であり、DIが失敗する原因であるかどうかを誰かが知っていますか?以前に@EJBインジェクションがサーブレットから機能すると述べたように、これは間違いなくRESTと関係があります。

4

4 に答える 4

1

キャストの問題について: Beanはプロキシでラップされているため、キャストする必要がiface.HelloInterfaceあります。HelloImpl

なぜ機能しないのかわかり@EJBませんが、WinkはEJBアノテーションとは何の関係もないと確信しています...

于 2012-03-01T15:49:17.427 に答える
0

問題の問題をなんとか解決できましたが、WAS8のデフォルト以外のJAX-RS実装を使用できませんでした。すべてのRESTfulリソースおよびWebでjavax.ws.rs.core.Applicationを拡張する必要がありました。 xmlサーブレットを次のように登録しました

<servlet>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

また、WebプロジェクトのWEB-INFフォルダーにibm-web-bnd.xmlとibm-web.ext.xmlが必要でした。そこにも空のbeans.xmlファイルがあります。これはCDIに必要ですが、これが必須であったかどうか思い出せません。

私はこれを解決できない多くのオンラインを見てきましたので、これが人々がこの問題を解決するのに役立つことを願っています。

于 2012-03-15T05:40:22.013 に答える
0

アプリへのEJB(NPExc。)の挿入についても同様の問題がありました。WAS 8(z / OS)にデプロイされました。インターフェイスビュー(同じEAR内のローカルEJB)を使用していませんでした。ローカルWAS8では、すべてが正常に機能しました。解決策は、(マニフェストファイル内の)WEBモジュールクラスパスからEJBclient.jarを削除することでした。

于 2012-12-17T09:16:21.053 に答える
0

コンテキストごとに古いインジェクションの方法を使用できます。これは、IBM Websphere 8で実行している場合に機能します。これは、Websphere9で修正されているためです。

if (adapterBusinessFacadeRemote == null) {
        try {
            Context initialContext = new InitialContext();
            adapterBusinessFacadeRemote = (IAdapterBusinessFacadeRemote) initialContext
                    .lookup("ejb/adapterBusinessFacadeRemote ");
        } catch (NamingException ex) {
            LOGGER.logError("process", "Cannot get connection: " + ex);
        }
    }
于 2021-03-09T14:38:09.053 に答える