I have two applications running on my local glassfish server. One to rent bicylces and one to buy train tickets. I now wanted to call a remote ejb from the train application to allow the rental of bicycles for the chosen time but I’m not really sure how to do it. I already tried a few different approaches. Both applications are in different packages and the train application has to know the bicycle remote interface but I don’t know how to accomplish that.
The remote interface (bicyle app):
@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 I want to call:
@Stateless(name="FahrradService",mappedName="FahrradService") public class FahrradService implements javax.ejb.SessionBean, FahrradRemote, Serializable { @PersistenceContext private EntityManager em; Kunde customer; ... }
Beginning of the train app:
@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() { } ... }
Error I get is a class not found exception, which i can understand because it’s a different application and my train app doesn’t know “FahrradRemote” but how can I inject that EJB?
Advertisement
Answer
In your bicycle app you have to:
- remove the
@Remote
annotation from yourinterface FahrradRemote
- add the
@Remote
annotation to yourFahrradService
EJB
You can follow this snippet:
@Remote(FahrradRemote.class) @Stateless public class FahrradService implements FahrradRemote, Serializable { .... // your code }
(if your are using EJB 3.X, there is no need for an EJB to explicitly implement the SessionBean interface)
In your train app:
@EJB(name="FahrradService") private FahrradRemote fahrradService;
(use name
attribute instead of mappedName
; and you cannot have static properties in a stateless EJB)
Finally you have to tell the container where to lookup for the EJB implementation: create the descriptor glassfish-ejb-jar.xml
and, inside glassfish-ejb-jar
tags, put this:
<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>
The portable JNDI name for your remote EJB (what I have called java:global/MyRemoteBeanModule/MyRemoteBean
) is available in GlassFish logs when you deploy the bicycle application.