5

我是 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.

让我知道是否需要任何其他文件。

4

2 回答 2

10

Your file structure looks alright.

So, where is the problem ?

@Localbean should be used inside your EJB bean only when your EJB is not extending interface. @Local can be used for interface and then extending your EJB with the interface or using @Local straingh inside your no-interface EJB. But @Localbean is only used for no-interface EJB. So, what you are doing is not right.

Since you are extending interface, do as below:

Interface

@Local
public interface StockManagementBeanJpa
{

....

}

EJB

@Stateless
public class StockManagementBeanJpaBean implements StockManagementBeanJpa 
{

....

}

Do this for all EJBs.

I want to point out 1 more thing that @Local will work in your case because you are calling EJBs from the same application (same EAR). This will not work in the case of cross application call(different EAR, WAR ...) or remote client calling your EJB. In this case, you will need @Remote.

于 2013-05-27T03:51:06.630 回答
0

在我的情况下,我在一些复制粘贴后不小心在 EJB 中有这些导入:

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

EJB 看起来像这样:

@Singleton
public class MyService {

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

于 2019-09-19T08:14:19.880 回答