【问题标题】:@Local interface with many realisation@Local 接口有很多实现
【发布时间】:2012-09-28 10:02:26
【问题描述】:

我有@Local接口

@Local
public interface IRepo
{  

还有两个实现,但是只有1个 bean实现

@Stateless(name = "RepoBean")
public class RepoBean implements IRepo
{  

public class SimpleRepo implements ILogRepositoryIRepo
{  

并使用

将其注入我的 Web 服务
   @EJB(name = "RepoBean")
   private IRepo repository;  

它在jbossWebLogic 上运行良好。但是在GlassFish 3.1.1 我得到错误(部署时)

  Cannot resolve reference Local ejb-ref name=RepoBean,Local 3.x interface =com.company.IRepo,ejb-link=null,lookup=,mappedName=,jndi-name=,refType=Session because there are 2 ejbs in the application with interface com.company.IRepo.  

但我只有 1 个 ejb 实现。
有任何想法吗?也许我可以使用一些部署描述符或其他东西。
EJB 3.0, Java EE 5

【问题讨论】:

    标签: java jakarta-ee glassfish ejb-3.0


    【解决方案1】:

    我真的不明白您要做什么,但是如果您有两个实现相同业务接口的 bean,则必须使用 'beanName' 属性,如下所示:

    @EJB(beanName = "RepoBean")
    private IRepo repository;
    

    -- 更新

    看看这个:java.net/node/702013。这个问题有一个bug issue:java.net/jira/browse/GLASSFISH-11684

    似乎这只发生在 EJB-in-WAR 打包中。在 ejb jar 中不会发生。

    【讨论】:

    • 我有 1 个豆子。两个认识。我有两个数据库 - Oracle 数据库(我使用 bean)和 XML 数据库(我使用 JAXB 编组)
    • 我同意这一点。在依赖于IRepo 的类中,您的@EJB 注释应该使用beanName 而不是name。我认为这就是服务器抱怨您有 2 个 impl 的原因。它似乎也认为您正在声明第二个 impl。另一种方法是从两个注释中完全删除name。如果您有 1 个 impl,则不需要。这是一个例子:bit.ly/PnKaNs 当然总是需要检查假设。您是否对项目进行了彻底清理并搜索了对 IRepo 的引用?
    【解决方案2】:

    好吧,Glassfish 比 JBoss 和 WebLogic 更正确,Business-Bean-Class 应该都有自己的 EJB-Local-Interface。

    我猜 WL 或 JBoss 会给你一个警告而不是一个错误。

    【讨论】:

      猜你喜欢
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多