【发布时间】:2015-10-28 21:16:55
【问题描述】:
我的耳朵结构如下:
- app-ear
- app-api
- app-ejb
- 应用网站
app-web 和 app-ejb 依赖于 app-api 模块,但它们并不相互依赖。
接口 (app-api) 和 bean (app-ejb):
package sample.services;
@Remote
public interface SampleServiceRemote{
...
}
package sample.services;
@Local
public interface SampleService extends SampleServiceRemote{
...
}
package sample.services;
@Stateless
@Local(SampleService.class)
@Remote(SampleServiceRemote.class)
public class SampleServiceBean implements SampleService{
...
}
我想从 app-api 和 app-web 模块中查找具有本地和远程接口的 SampleServiceBean:
InitialContext ic = new InitialContext();
//Case #1: Works fine without any exception
SampleServiceRemote service = (SampleServiceRemote) ic.lookup("java:global/app-ear/app-ejb/SampleServiceBean!sample.services.SampleServiceRemote");
//Case #2: Throws ClassCastException
SampleService service = (SampleService) ic.lookup("java:global/app-ear/app-ejb/SampleServiceBean!sample.services.SampleService");
当我在 WildFly 服务器 (9.0.1.Final) 上使用本地接口查找时,它会返回一个 sample.services.SampleService$$$view4 对象,该对象无法转换为 SampleService。
我在 Glassfish 4.1 上尝试了相同的应用程序,但它运行良好。返回的对象:
- 远程:javax.naming.Reference(可转换为 SampleServiceRemote)
- 本地:com.sun.ejb.containers.JavaGlobalJndiNamingObjectProxy(可转换为 SampleService)
谁能告诉我,我怎样才能在 WildFly 上实现相同的行为?
更新 1
我尝试了 user140547 推荐的解决方案。它没有用。它返回相同的类:/。
更新 2
经过几天的尝试和 Google 搜索,我决定将 EJB 从我的项目中排除。它们不是必需的,没有它们我也可以做到。 问题是,当我尝试将 bean 用作 Local 时,Wildfly 总是给我一些 Proxy 类,这些类不能转换为 Local 接口(也不能转换为 Remote 接口)。 我只能使用 @EJB 注释获得本地引用,但在 EJB 模块之外它只返回一个 null :/.
【问题讨论】:
-
如果您尝试使用stackoverflow.com/questions/1351431/… 的答案中的接口,那么它可以工作吗?另外,在接口和bean上同时使用
@Local和@Remote不是多余的吗? -
与您的具体问题无关 - 1st)为什么使用 ear-deployment 和 2nd)为什么使用 JNDI 进行查找而不是注入机制?
-
1st) 我正在使用 EAR,因为我想创建一个 JMS Utility Web 应用程序,并且我不想要很多文件。 Web 将包含一些 REST 服务和用于测试的基本 HTML 等。 2)我只想从 Web 层使用 JNDI 查找,而不是形成 EJB。我尝试了
@Inject和@EJB,但网络没有 EJB 容器。@Inject版本无法部署,@EJB给出 NullPointerException。
标签: jakarta-ee wildfly ejb-3.1 stateless-session-bean glassfish-4.1