我在本地glassfish服务器上运行了两个应用程序。一个租住bicylces,一个买火车票。我现在想从火车应用程序拨打远程ejb,以便在选定的时间内租用自行车,但我不确定该怎么做。我已经尝试了几种不同的方法。两个应用程序都在不同的包中,列车应用程序必须知道自行车远程接口,但我不知道如何实现。
远程界面(自行车应用程序):
@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”但是我如何注入该EJB?
答案 0 :(得分:3)
在您的自行车应用程序中,您必须:
@Remote
interface FahrradRemote
注释
@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;
(使用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>
部署自行车应用程序时,GlassFish日志中提供了远程EJB的可移植JNDI名称(我称之为java:global/MyRemoteBeanModule/MyRemoteBean
)。
答案 1 :(得分:0)
你应该有一个FahrradService-EJB
jar和一个FahrradService-client
jar(名字就是例子,只有两个罐子)。如果使用Jave EE插件/工具创建EJB,则IDE将为您生成。
您的EBJ jar和客户端jar都将与其中一个应用程序打包在一起。部署应用程序将建立EJB,因此可以引用,查找,注入等。
您的客户端jar将打包在任何其他希望通过@EJB或查找来使用EJB的应用程序中。
假设两个应用程序都要部署到同一个app-server实例,那应该就是这么简单。
答案 2 :(得分:0)
我们在两个服务器中使用了相同的示例:Glassfish 4.1.1和Websphere Traditional 8.5.5.5
在这两种情况下,我们都部署了两个独立的包:
servlet通过远程接口使用@EJB注入EJB,而没有任何注入点参数。这在Glassfish中有效。 但,为了使其在Websphere中运行,我们必须在注入点 @EJB(lookup =“java:global / ejbBasico / NewSessionBean”)中包含以下显式查找 < / p>
Glassfish Servlet代码:
/*imports omitted */
@WebServlet(name = "MiServlet", urlPatterns = {"/MiServlet"})
public class Servlet extends HttpServlet {
@EJB
private Interfaz miEjb;
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("Result: " + miEjb.businessMethod());
}
finally {
out.close();
}
/*Additional servlet code not included*/
}
Glassfish EJB代码段:
/*imports omitted */
@Stateless
public class NewSessionBean implements Interfaz {
@Override
public String businessMethod() {
return("You've called the EJB");
}
}
<强>接口强>:
/*imports omitted */
@Remote
public interface Interfaz {
String businessMethod();
}