首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法解析@EJB引用:

无法解析@EJB引用:
EN

Stack Overflow用户
提问于 2012-01-10 02:40:57
回答 3查看 15K关注 0票数 0

我正在尝试在我的项目中实现EJB,但在部署到JBoss时仍然出现相同的错误,因为6(最终)。

我有两个类:

代码语言:javascript
复制
@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:

代码语言:javascript
复制
@Stateless
public class CacheManagementServiceImpl implements CacheManagementService {

@EJB
private ForecastReturnService forecastReturnService;
}

错误消息与我试图注入的'forecastReturnService‘bean有关:

代码语言:javascript
复制
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控制台中注意到以下消息:

代码语言:javascript
复制
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注释中,似乎可以消除错误:

代码语言:javascript
复制
@EJB(lookup="com.ls.forecast.jpa.ForecastReturnService/local")
private ForecastReturnService forecastReturnService;

我不确定为什么我必须指定本地接口,因为我已经看到了许多仅使用@EJB的示例/教程。为什么我需要指定本地接口?

EN

回答 3

Stack Overflow用户

发布于 2013-01-16 07:30:50

我一直在寻找这个解决方案,终于找到了。首先,我们需要了解标准的EE6(可移植JNDI) JNDI。JBoss文档太烂了。你必须寻找你的解决方案。

可移植JNDI (前缀):

  • java:app

仅在应用程序中可用(即EAR)

  • java:global

容器中的任何应用程序都可以使用(即,甚至在EAR)

  • java:module之外

仅在模块(即模块- EJB) 中可用

让我们来看看JBoss 6.1.0JMX控制台。

JMX Console > service=JNDIView (在JBoss部分下)

这将显示JMX MBean视图

现在,您可以通过单击invoke按钮list行(我的是最后一行)来查看JNDI树,您还可以使用listXML,但我发现这很令人困惑。

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

ForecastReturnServiceImpl!inject.ForecastReturnService > ForecastReturnServiceEJB (项目名称)> global

将其转换为:

java:global/ForecastReturnServiceEJB/ForecastReturnServiceImpl!inject.ForecastReturnService

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

代码语言:javascript
复制
 @EJB(mappedName="java:global/ForecastReturnServiceEJB/ForecastReturnServiceImpl!inject.ForecastReturnService")
private ForecastReturnService forecastReturnService;

代码语言:javascript
复制
 @EJB(mappedName="java:app/ForecastReturnServiceEJB/ForecastReturnServiceImpl!inject.ForecastReturnService")
private ForecastReturnService forecastReturnService;

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

票数 2
EN

Stack Overflow用户

发布于 2012-01-11 06:41:49

我通过修改我的项目解决了这个问题,现在它被打包为ear而不是war。我现在可以根据需要拥有任意多的EJBs,尽管我决定利用这个机会重新组织项目,并将所有ejb放在同一个Maven模块中。

票数 0
EN

Stack Overflow用户

发布于 2012-01-11 06:43:23

在你实现的接口中有什么特别的东西吗?

当我在本地快速尝试时,部署到JBoss AS 6的最简单的实现就能正常工作:

代码语言:javascript
复制
package inject;

public interface ForecastReturnService {

}

要注入的bean:

代码语言:javascript
复制
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的接口:

代码语言:javascript
复制
package inject;

public interface CacheManagementService {

}

注入发生的Bean:

代码语言:javascript
复制
package inject;

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

@Stateless
public class CacheManagementServiceImpl implements CacheManagementService {

    @EJB
    private ForecastReturnService forecastReturnService;
}

日志中的相关条目:

代码语言:javascript
复制
[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

代码语言:javascript
复制
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

两个小注释(与您的问题没有直接关系),但这里不需要@TransactionAttributeREQUIRED已经是默认设置。应该在接口上使用@Local,在类级别上使用它是用于无法由您更改的遗留接口。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8793427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档