2012-01-09 47 views
0

プロジェクトにEJBを実装しようとしていますが、JBoss AS 6(最終版​​)にデプロイするときに同じエラーが発生します。@EJB参照を解決できませんでした:

私は2つのクラスがあります。エラーメッセージは、私が注入しようとしている 'forecastReturnService' 豆に関してです

@Stateless 
public class CacheManagementServiceImpl implements CacheManagementService { 

@EJB 
private ForecastReturnService forecastReturnService; 
} 

DEPLOYMENTS IN ERROR: 
    Deployment "vfs:///C:/jboss/jboss-6.0.0.Final/server/default/deploy/webui.war" is in error due to the following reason(s): java.lang.RuntimeException: Could not resolve @EJB reference: [EJB Referenc 
e: beanInterface 'com.ls.forecast.jpa.ForecastReturnService', beanName 'null', mappedName 'null', lookupName 'null', owning unit '[email protected]{org.jboss.metadata.ejb.jboss.JBoss 
EnterpriseBeanMetaData.CacheManagementServiceImpl}'] for environment entry: env/com.ls.forecast.webui.business.CacheManagementServiceImpl/forecastReturnService in unit [email protected] 
526{org.jboss.metadata.ejb.jboss.JBossEnterpriseBeanMetaData.CacheManagementServiceImpl} 

    at org.jboss.deployers.plugins.deployers.DeployersImpl.checkComplete(DeployersImpl.java:1228) [:2.2.0.GA] 
    at org.jboss.deployers.plugins.main.MainDeployerImpl.checkComplete(MainDeployerImpl.java:905) [:2.2.0.GA] 
    at org.jboss.system.server.profileservice.deployers.MainDeployerPlugin.checkComplete(MainDeployerPlugin.java:87) [:6.0.0.Final] 
    at org.jboss.profileservice.deployment.ProfileDeployerPluginRegistry.checkAllComplete(ProfileDeployerPluginRegistry.java:107) [:0.2.2] 
    at org.jboss.system.server.profileservice.bootstrap.BasicProfileServiceBootstrap.start(BasicProfileServiceBootstrap.java:135) [:6.0.0.Final] 
    at org.jboss.system.server.profileservice.bootstrap.BasicProfileServiceBootstrap.start(BasicProfileServiceBootstrap.java:56) [:6.0.0.Final] 
    at org.jboss.bootstrap.impl.base.server.AbstractServer.startBootstraps(AbstractServer.java:827) [jboss-bootstrap-impl-base.jar:2.1.0-alpha-5] 
    at org.jboss.bootstrap.impl.base.server.AbstractServer$StartServerTask.run(AbstractServer.java:417) [jboss-bootstrap-impl-base.jar:2.1.0-alpha-5] 
    at java.lang.Thread.run(Thread.java:619) [:1.6.0_20] 

@Stateless 
@Local(ForecastReturnService.class) 
@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public class ForecastReturnServiceImpl implements ForecastReturnService { 

private static final Logger logger = LoggerFactory 
     .getLogger(ForecastReturnServiceImpl.class); 

@PersistenceContext 
protected EntityManager em; 
} 

や他のEJBを

JBossコンソールで次のメッセージが表示されました。

13:34:27,681 WARN [MappedReferenceMetaDataResolverDeployer] Unresolved references exist in JBossMetaData:[#CacheManagementServiceImpl:AnnotatedEJBReferenceMetaData{name=com.ls.forecast.webui.business 
.CacheManagementServiceImpl/forecastReturnService,ejb-ref-type=null,link=null,ignore-dependecy=false,mapped/jndi-name=null,resolved-jndi-name=null,beanInterface=interface com.ls.forecast.jpa.ForecastR 
eturnService}, #EntityForecastReturnResultServiceImpl:AnnotatedEJBReferenceMetaData{name=com.ls.forecast.webui.business.EntityForecastReturnResultServiceImpl/entityForecastReturnProcessor,ejb-ref-type 

ご協力いただければ幸いです。私は配管の中で何か...

をしないのですように私は、私は@EJB注釈に以下を追加した場合、エラーを取り除くように見えることを追加したいようだ:

@EJB(lookup="com.ls.forecast.jpa.ForecastReturnService/local") 
private ForecastReturnService forecastReturnService; 

ありません@EJBだけのチュートリアルや多くの例を見てきたので、なぜローカル・インターフェースを指定しなければならないのでしょうか?なぜローカルインターフェイスを指定する必要がありますか?

答えて

0

私のプロジェクトを変更して、この問題を解決しました。これで、戦争ではなく耳になるようになりました。この機会にプロジェクトを再編成し、すべてのEJBを同じMavenモジュールに配置することにしましたが、私は現在、必要なだけ多くのejb jarファイルを作成できます。

+0

FYI、私は.warでテストし、問題は発生しませんでした。たぶん最小限のコードで完全な新しい戦争を作り、それでも問題を抱えているかどうかを確認する必要があります。そうでない場合は、ゆっくりと元のコードに戻って、再び中断してください。 –

+0

私の戦争は、複数のMavenサブモジュール(jar)で構成されていました。なぜなら、いくつかのEJBにバインドできず、他のものを見つけることができたからです(つまり、Webモジュールの直下にあるものが選ばれました)。 – user899757

+0

"複数のMavenサブモジュール" - 恐ろしい音... –

0

実装するインターフェイスに固有のものはありますか?

のJBoss AS 6に展開最も簡単な実装では、ちょうど私はすぐにそれをローカルにしようとしたときに動作します:注入が行われる豆の

package inject; 

import javax.ejb.Local; 
import javax.ejb.Stateless; 
import javax.ejb.TransactionAttribute; 
import javax.ejb.TransactionAttributeType; 

@Stateless 
@Local(ForecastReturnService.class) 
@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public class ForecastReturnServiceImpl implements ForecastReturnService { 


} 

インタフェース:

package inject; 

public interface ForecastReturnService { 

} 

Beanを注入されます

package inject; 

public interface CacheManagementService { 

} 

注射が行われる豆

package inject; 

import javax.ejb.EJB; 
import javax.ejb.Stateless; 

@Stateless 
public class CacheManagementServiceImpl implements CacheManagementService { 

    @EJB 
    private ForecastReturnService forecastReturnService; 
} 

関連するログにエントリ:

[org.jboss.ejb3.EJBContainer] STARTED EJB: inject.ForecastReturnServiceImpl ejbName: ForecastReturnServiceImpl 
[org.jboss.ejb3.proxy.impl.jndiregistrar.JndiSessionRegistrarBase] Binding the following Entries in Global JNDI: 

    ForecastReturnServiceImpl/local - EJB3.x Default Local Business Interface 
    ForecastReturnServiceImpl/local-inject.ForecastReturnService - EJB3.x Local Business Interface 

STARTED EJB: inject.CacheManagementServiceImpl ejbName: CacheManagementServiceImpl 
[org.jboss.ejb3.proxy.impl.jndiregistrar.JndiSessionRegistrarBase] Binding the following Entries in Global JNDI: 

    CacheManagementServiceImpl/local - EJB3.x Default Local Business Interface 
    CacheManagementServiceImpl/local-inject.CacheManagementService - EJB3.x Local Business Interface 

二つの小さな発言(直接あなたの質問に関連していない)が、@TransactionAttributeは、ここで必要とされていません。 REQUIREDは既にデフォルトです。 @Localをインターフェイスで使用する必要があります。クラスレベルでこれを使用すると、変更できないレガシーインターフェイスが使用されます。

2

私はこの解決策のために最低を探しましたが、ついにそれを得ました。まず、標準のEE 6(移植可能なJNDI)JNDIを認識する必要があります。 JBossのドキュメントはうんざりです。あなたはあなたの解決策を捜す必要があります。

ポータブルJNDI(プレフィックス):コンテナ内の任意のアプリケーションから

  • java:app
    のみアプリケーション内で使用可能な(すなわちEAR)
  • java:global
    使用可能(すなわち偶数EAR外)
  • java:module
    モジュール(つまり、モジュール - EJB)内でのみ使用可能です。

は、JBoss 6.1.0 JMX Consoleを見てみましょう。
今、あなたは、(私が最後の行だった)を呼び出すボタンlist行をクリックしてJNDIツリーを表示することができ JMX(JBossのセクションの下で)コンソール>サービス= JNDIView

これはあなたのJMX MBeanのビューを提供します
私たちもlistXMLすることができますが、私はそれが混乱していることがわかりました。 (私たちはEAR外でリモートからEJBを使用したいので)globalで始まるブランチへjava:セクションスクロール下


。もし上記のコードから判断すると、何かのようになり、パスを見つけることができるはずです:

グローバル> ForecastReturnServiceEJB(プロジェクト名)> ForecastReturnServiceImpl inject.ForecastReturnServiceは

にこれを翻訳:!
java:global/ForecastReturnServiceEJB/ForecastReturnServiceImpl!inject.ForecastReturnService

これは、グローバルアクセスに使用するために必要なJNDIです。

@EJB(mappedName="java:global/ForecastReturnServiceEJB/ForecastReturnServiceImpl!inject.ForecastReturnService") 
private ForecastReturnService forecastReturnService; 

または

@EJB(mappedName="java:app/ForecastReturnServiceEJB/ForecastReturnServiceImpl!inject.ForecastReturnService") 
private ForecastReturnService forecastReturnService; 

もう一つ、あなただけの同じEAR内のパラメータなし@EJBを使用することができます。

関連する問題