java - 如何从同一 GlassFish Server 上的另一个应用程序注入(inject) EJB?

标签 java jakarta-ee glassfish ejb

我有两个应用程序在我的本地 glassfish 服务器上运行。一个租自行车,一个买火车票。我现在想从火车应用程序调用远程 ejb 以允许在选定的时间租用自行车,但我不太确定该怎么做。我已经尝试了几种不同的方法。这两个应用程序在不同的包中,火车应用程序必须知道自行车远程接口(interface),但我不知道如何实现。

远程接口(interface)(自行车应用):

@Remote
public interface FahrradRemote {
    public List<Fahrrad> findAvaible(Date start, Date end);
    public void addAuftrag(Fahrrad fahrrad, Date startDate, Date endDate);
    public boolean login(String name, String passwort);
}

我要调用的自行车EJB:

@Stateless(name="FahrradService",mappedName="FahrradService")
public class FahrradService implements javax.ejb.SessionBean, FahrradRemote, Serializable {

    @PersistenceContext
    private EntityManager em;
    Kunde customer;
...
}

火车应用程序的开始:

@Named
@SessionScoped
public class BahnPM implements Serializable {

    private String startStation;
    private String zielStation;
    private String loginName;
    private String loginPasswort;
    private String customerName;
    private String startDateString;
    private Date startDate;
    private List<Fahrt> available;
    private List stations;


    @EJB
    private BahnService service;

    @EJB(mappedName="FahrradService")
    private static FahrradRemote fahrradService;

    public BahnPM() {
    }

    ...
}

我得到的错误是一个类未找到异常,我可以理解,因为它是一个不同的应用程序,我的火车应用程序不知道“FahrradRemote”,但我如何注入(inject)该 EJB?

最佳答案

在您的自行车应用程序中,您必须:

  • 从您的 interface FahrradRemote 中删除 @Remote 注释
  • @Remote 注释添加到您的 FahrradService EJB

你可以按照这个片段:

@Remote(FahrradRemote.class)
@Stateless
public class FahrradService implements FahrradRemote, Serializable {
    .... // your code 
}

(如果您使用的是 EJB 3.X,则 EJB 无需显式实现 SessionBean 接口(interface))

在您的火车应用中:

@EJB(name="FahrradService") 
private FahrradRemote fahrradService;

(使用 name 属性代替 mappedName;并且在无状态 EJB 中不能有静态属性)

最后,您必须告诉容器在何处查找 EJB 实现:创建描述符 glassfish-ejb-jar.xml 并在 glassfish-ejb-jar 中标签,放这个:

<enterprise-beans>
  <ejb>
    <ejb-name>BahnPM</ejb-name>
    <ejb-ref>
      <ejb-ref-name>FahrradService</ejb-ref-name>
      <jndi-name>java:global/MyRemoteBeanModule/MyRemoteBean</jndi-name>
    </ejb-ref>
  </ejb>
</enterprise-beans>

当您部署自行车应用程序时,您的远程 EJB 的可移植 JNDI 名称(我称之为 java:global/MyRemoteBeanModule/MyRemoteBean)在 GlassFish 日志中可用。

关于java - 如何从同一 GlassFish Server 上的另一个应用程序注入(inject) EJB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11916045/

相关文章:

java - 基于文本的 Java 游戏将变量传递给另一个类

java - 我想在不插入手机的情况下构建+启动新的应用程序构建。有没有办法从 Android 应用程序中下载和启动 APK 文件?

java - 您如何决定在哪些实体类中放置 JPA NamedQuery 注释?

java - 您如何管理 java webapps 中的嵌入式配置文件和库?

jakarta-ee - 在 EJB 3.1 中存储 SFSB 引用

java - Pojo 类(XML 到对象)

java - 通过改造在 POST 请求中发送 JSON

java - 什么是页面作者

glassfish - Glassfish 访问日志在哪里

java - 从基于 Glassfish 的 Web-AP 访问 HTTPS Web 服务