【问题标题】:Lookup EJB with local interface on WildFly在 WildFly 上使用本地接口查找 EJB
【发布时间】: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


【解决方案1】:

看到这个问题:access a Local Session Bean from another EAR? 似乎从另一个应用程序访问本地 bean 是 EJB 的一个可选功能,因此它可能适用于 Glassfish,但不适用于 Wildfly。

另一方面,您的问题是关于 EAR。但是,如果这个答案也适用于您,那么它与同时提供的@Remote 接口无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 2015-01-25
    • 1970-01-01
    • 2015-06-12
    • 2011-04-17
    相关资源
    最近更新 更多