我有两个应用程序在我的本地 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/