【问题标题】:JBAS014544: No EJB found with interfaceJBAS014544:没有找到带有接口的 EJB
【发布时间】:2013-05-21 05:49:42
【问题描述】:

我是 Java EE 的新手,我正在使用 JBoss 7 创建我的第一个项目。我的工作区中有一个 EAR 项目、一个 EJB 项目、一个 WEB 项目和一个 JPA 项目。在 EJB 项目中创建的 ejb 想要使用在 JPA 项目中创建的 ejb。这一切都编译得很好,但是当我部署 EAR 项目时,我得到以下异常并且部署失败。这是主要的异常原因。

JBAS014544: 找不到接口类型为接口的 EJB 'com.kohlisoft.stockmanagement.jpa.service.StockManagementBeanJpa' 对于 捆绑 com.kohlisoft.stockmanagement.ejb.main.StockManagementService/sms

我怀疑 EJB 项目无法查看 jpa jar 中的类。

我已经通过各种链接来解决它,但没有任何帮助。基于一些建议,我修改了它,但仍然没有乐趣。 1.我检查了结构,JPA项目在.ear的lib文件夹下。 2.更新了EJB项目的manifest文件,将依赖添加到jpa jar中。

我真的很感激这里的任何帮助。

JPA 项目中的 EJB。

@Stateless
@LocalBean
public class StockManagementBeanJpaBean implements StockManagementBeanJpa {

    @PersistenceContext(unitName="StockManagement")
    private EntityManager em;

使用它的 EJB 项目中的 EJB:

@Stateless
@LocalBean
public class StockManagementService implements StockManagementServiceLocal {

    @EJB
    StockManagementBeanJpa sms;

...

EJB 项目清单文件。

Manifest-Version: 1.0
Class-Path: StockManagement-ejbClient.jar
Dependencies: lib/StockManagement-jpa.jar

这是 .ear 中 .jars 和 .war 的结构。

.ear
 |____ ejb.jar
 |
 |____ ejbClient.jar
 |
 |____ web.war
 |
 |____ /lib
         |
         | ____ jpa.jar
         |
         | ____ all other jars related to derby client, hibernate, jta etc.

如果需要任何其他文件,请告诉我。

【问题讨论】:

  • 邮政编码和配置文件。
  • 也请发布您的ear文件结构。指示哪些库放置在哪里。
  • 我认为您应该使用远程或本地注释来注释您的接口。
  • @HenriqueOrdine - 你提到的注释被应用在各自的接口上。​​

标签: jakarta-ee jpa ejb


【解决方案1】:

在我的例子中,我在复制粘贴后不小心在 EJB 中有这些导入:

import javax.ejb.*;
import javax.inject.Singleton;

EJB 看起来像这样:

@Singleton
public class MyService {

Maven 构建完成,但该类未部署为 EJB。删除import javax.inject.Singleton; 后,它工作正常。

【讨论】:

    【解决方案2】:

    您的文件结构看起来不错。

    那么,问题在哪里?

    @Localbean 应该在你的 EJB bean 中使用,只有当你的 EJB 没有扩展接口时。 @Local 可用于interface,然后使用该接口扩展您的EJB,或者在您的no-interface EJB 中使用@Local straingh。但@Localbean 仅用于无接口 EJB。所以,你的做法是不对的。

    既然你是扩展接口,请执行以下操作:

    界面

    @Local
    public interface StockManagementBeanJpa
    {
    
    ....
    
    }
    

    EJB

    @Stateless
    public class StockManagementBeanJpaBean implements StockManagementBeanJpa 
    {
    
    ....
    
    }
    

    对所有 EJB 执行此操作。

    我想再指出一件事,@Local 将适用于您的情况,因为您正在从同一个应用程序(同一个 EAR)调用 EJB。这在跨应用程序调用(不同的 EAR、WAR ...)或远程客户端调用您的 EJB 的情况下不起作用。在这种情况下,您将需要@Remote

    【讨论】:

    • 问题不在于罐子的正确形成。问题是 EBJ jar 无法在 JPA jar 下看到 ejb。如果我将 JPA jar 移动到 EJB jar 的同一级别,它可以正常工作。希望这些信息对您有所帮助。
    • 如果 Jar 可见性是一个问题,则将其上移一级。它适用于您的代码吗?
    • 非常感谢您的宝贵时间。正如已经提到的,如果我将它提升一个级别,它工作正常,从第一天开始。但我不想改变结构,实际上想按照现有结构访问那个 jar。我确信这是可能的,但唯一的问题是不知道正确的方法。
    • 做一件事。部署后,检查所有 EJB 是否部署正确。检查他们部署的 JNDI 名称。
    • 与现有结构。 jpa.jar中的ejb已经部署,但是EJB.jar中的ejb没有部署,因为它看不到jpa.jar中的ejb,所以部署失败。这就是为什么当我将 jpa.jar 上移一层时,它能够部署所有的 jar。
    猜你喜欢
    • 1970-01-01
    • 2020-09-18
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    相关资源
    最近更新 更多