编程语言
首页 > 编程语言> > java-如何从同一GlassFish Server上的其他应用程序注入EJB?

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

作者:互联网

我的本地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?

解决方法:

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

>从界面FahrradRemote中删除@Remote批注
>将@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;

(使用名称属性而不是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>

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

标签:glassfish,ejb,java,java-ee
来源: https://codeday.me/bug/20191127/2076966.html