当前位置: 首页 > 面试题库 >

如何从同一GlassFish Server上的其他应用程序注入EJB?

赵雪峰
2023-03-14
问题内容

我的本地glassfish服务器上运行了两个应用程序。一位租用比奇,另一位购买火车票。我现在想从火车应用程序中调用一个远程ejb,以允许在选定的时间内租用自行车,但是我不确定如何做到。我已经尝试了几种不同的方法。两种应用程序使用不同的软件包,火车应用程序必须知道自行车远程接口,但我不知道如何实现。

远程界面(bicyle应用):

@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);
}

我想调用的Bicycle 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”,但是如何注入该EJB?


问题答案:

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

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

您可以按照以下代码段进行操作:

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

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

在火车应用程序中:

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

(使用nameattribute代替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>

java:global/MyRemoteBeanModule/MyRemoteBean部署Bike应用程序时,GlassFish日志中将提供远程EJB(我称为)的可移植JNDI名称。



 类似资料:
  • 我试图开发一个android应用程序,可以擦除其他应用程序的缓存数据,我试图浏览所有的博客,但没有一个对我有效,我可以通过以下代码清除我的应用程序的缓存 我想清除其他应用程序的缓存,可以任何机构请帮助我,如果我错了请纠正我,提前谢谢。

  • 我想捕捉一个在我的手机上运行的Android应用程序的屏幕截图。 我尝试使用屏幕截图UX应用程序。这也可以在无根电话上完成。你知道如何从后台运行的服务中获取Android应用程序的屏幕截图吗? 我希望我的服务定期捕捉屏幕,并发送到服务器。

  • 从其他应用程序(如 Photoshop、Illustrator、After Effects、Sketch)中导入资源,甚至将图像从 Web 浏览器拖放到 Adobe XD 或将图像从剪贴板粘贴到 Adobe XD 中。 您可以将资源从其他 Adobe 应用程序(例如 Photoshop、Illustrator)和第三方应用程序(如 Sketch)导入 Adobe XD。您可以在 XD 中进一步改进

  • 问题内容: 我正在尝试使用@EJB注释注入EJB: 当我在同一个耳朵中将EJB注入另一个EJB时,它可以正常工作。 当我从同一服务器的另一端将EJB注入另一个EJB时,出现异常: EJB在调用方法“ sayHello”期间引发了意外的(未声明的)异常。异常数据:javax.ejb.EJBException:注入失败;嵌套的异常是:com.ibm.ejs.container.EJBNotFoundE

  • 如果主方法不能使用,我需要一些关于替代解决方案的建议,以满足这个要求。

  • 我有两个应用程序,第一个应用程序启动ActiveMQ代理(https://spring.io/guides/gs/messaging-jms/ ). 在第二个应用程序,我想从第一个应用程序的主题。 我如何在不启动ActiveMQ服务器的情况下执行此操作? 可能的解决办法: 服务器应用程序项目 客户端应用程序项目 这是正确的方法吗? 用这个解决了: http://javasampleapproach