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?
In your bicycle app you have to:
@Remote
annotation from your interface FahrradRemote
@Remote
annotation to your FahrradService
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.