5

1つのejb-jar(sample-ejb)ファイルと1つのwarファイル(sample-web)を含むEARファイル(JEE6)があります。構造は次のとおりです。

sample-ear
         |----sample-ejb.jar
         |         |---TestEjb.java (@Singleton)
         |
         |----sample-web
                   |---StartupEjb.java (@Singleton,@Startup)
                   |---TestListener.java (@WebListener)

TestEjbをStartupEjbまたはTestListenerに挿入する場合:

@EJB
private TestEjb testEjb;

次のエラーが発生します:

Glassfish:

Caused by: com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Remote ejb-ref name=com.sample.StartupEjb/testEjb,Remote 3.x interface =com.sample.TestEjb,ejb-link=null,lookup=,mappedName=,jndi-name=com.sample.TestEjb,refType=Session into class com.sample.StartupEjb: Lookup failed for 'java:comp/env/com.sample.StartupEjb/testEjb' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming}

weblogic:

Caused By: weblogic.application.naming.ReferenceResolutionException: [J2EE:160200]Error resolving ejb-ref "com.sample.StartupEjb/testEjb" from module "sample-web-1.0-SNAPSHOT.war" of application "com.sample_sample-ear_ear_1.0-SNAPSHOT". The ejb-ref does not have an ejb-link and the JNDI name of the target bean has not been specified. Attempts to automatically link the ejb-ref to its target bean failed because no EJBs in the application were found to implement the "com.sample.TestEjb" interface. Link or map this ejb-ref to its target EJB and ensure the interfaces declared in the ejb-ref are correct.

GlassfishとWeblogicの両方がTestEjbを見つけることができません!

ちなみに、TestEjbのリモートインターフェイスを作成し、それをインジェクションに使用すると、うまく機能します。ただし、リモートインターフェイスを定義したくないので、インターフェイスなしでEJBを使用したいと思います。この単純なユースケースのリモートインターフェイスを定義する必要はないと思います。

ここからソースコードをダウンロードできます:https ://dl.dropbox.com/sh/63hn3n9y3p5ypvi/SsG9iZIvx9/sample.zip?dl = 1

これは、NetBeansを使用して作成された単純なMavenプロジェクトです。

4

1 に答える 1

6

通常、ローカルインターフェイスを定義する必要があります。

@Singleton
@Local(PublicInterface.class)
public class MyBean implements PublicInterface {
  ...
}

このインターフェースを明示的に回避する場合は、Beanを@LocalBeanとしてマークする必要があります。

@Singleton
@LocalBean
public class MyBean {
  ...
}

PS:コードはテストされていませんが、役立つはずです。

于 2012-08-07T14:00:43.483 に答える