Skip to content
Advertisement

How can I inject an EJB from another application on the same GlassFish Server?

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 your interface FahrradRemote
  • add the @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.

User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement