Jboss 无法解析@EJB引用:

Jboss 无法解析@EJB引用:,jboss,ejb,ejb-3.0,Jboss,Ejb,Ejb 3.0,我试图在我的项目中实现EJB,但在部署到JBoss 6(最终版本)时,仍然会遇到相同的错误 我有两门课: @Stateless @Local(ForecastReturnService.class) @TransactionAttribute(TransactionAttributeType.REQUIRED) public class ForecastReturnServiceImpl implements ForecastReturnService { private static fin

我试图在我的项目中实现EJB,但在部署到JBoss 6(最终版本)时,仍然会遇到相同的错误

我有两门课:

@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:

@Stateless
public class CacheManagementServiceImpl implements CacheManagementService {

@EJB
private ForecastReturnService forecastReturnService;
}
错误消息与我尝试注入的“ForecasterturnService”bean有关:

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 'ComponentDeploymentContext@16939526{org.jboss.metadata.ejb.jboss.JBoss
EnterpriseBeanMetaData.CacheManagementServiceImpl}'] for environment entry: env/com.ls.forecast.webui.business.CacheManagementServiceImpl/forecastReturnService in unit ComponentDeploymentContext@16939
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]
我注意到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的示例/教程。为什么我需要指定本地接口?

我通过修改我的项目解决了这个问题,使其现在打包为ear而不是war。尽管我决定借此机会重新组织项目并将所有ejb放在同一个Maven模块中,但我现在可以拥有所需的任意多个ejb JAR。

您实现的接口中有什么特定的内容吗

部署到JBoss AS 6的最直接的实现在我快速在本地试用时才起作用:

package inject;

public interface ForecastReturnService {

}
要注入的bean:

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 {


}
发生注入的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;
}
注射发生的位置:

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


两个小评论(与您的问题没有直接关系),但是这里不需要
@TransactionAttribute
<代码>必需已经是默认值<代码>@Local应该在接口上使用,在类级别上使用它是用于您无法更改的旧接口。

我已经对该解决方案进行了高低搜索,终于找到了它。首先,我们需要了解标准的EE6(便携式JNDI)JNDI。JBoss文档很糟糕。你必须寻找你的解决办法

可移植JNDI(前缀):

  • java:app

    仅在应用程序(即EAR)中可用
  • java:global

    可从容器中的任何应用程序使用(即即使在EAR之外)
  • java:module

    仅在模块内可用(即模块-EJB)
让我们看看JBoss 6.1.0 JMX控制台
JMX Console>service=JNDIView(在JBoss部分下)

这将为您带来JMX MBean视图
现在,您可以通过单击invoke按钮
list
行(我的是最后一行)来查看JNDI树,您也可以使用
listXML
,但我发现这很混乱


java:
部分下,滚动到以
global
开头的分支(因为我们希望在EAR之外远程使用EJB)。根据上面的代码判断,您应该能够找到类似以下内容的路径:

全局>ForecastReturnServiceEJB(项目名称)>ForecastReturnServiceImpl!inject.forecasterturnservice

将此翻译为:
java:global/ForecastReturnServiceEJB/ForecastReturnServiceImpl!inject.ForecastReturnService

这是我们需要用于全局访问的JNDI

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


还有一件事,您只能在同一个EAR中使用
@EJB
而不使用参数。

仅供参考,我在.war中进行了测试,没有遇到您的问题。也许你应该尝试用最少的代码创建一场全新的战争,看看你是否仍然遇到这个问题。如果没有,慢慢地重新构建完整的代码,直到它再次崩溃。我的war由多个Maven子模块(JAR)组成,这就是为什么它不能绑定一些EJB,但可以找到其他EJB(即直接在web模块下的那些被拾取)。