1

我使用 Wildfly 17 并且有几个无状态 EJB,其中一个有时(但并非总是)在 JNDI 查找时导致我出现问题。这是我的 EJB:

@Stateless
public class AVeDBService {
  //other stuff here
}

当我部署我的应用程序时,我看到上述服务的以下日志:

java:global/heimdi/AVeDBService!at.home.digest.services.AVeDBService
java:app/heimdi/AVeDBService!at.home.digest.services.AVeDBService
java:module/AVeDBService!at.home.digest.services.AVeDBService
ejb:/heimdi/AVeDBService!at.home.digest.services.AVeDBService
java:global/heimdi/AVeDBService
java:app/heimdi/AVeDBService
java:module/AVeDBService

我有一个 ServiceLocator 类,它是一个单例,使用以下 JNDI 名称查找上述服务的存根:

    public class ServiceLocator {

     private static final String AVE_DB_SERVICE_JNDI_KEY = 
     "java:global/heimdi/AVeDBService!at.home.digest.services.AVeDBService";

     private Map<String, Object> serviceHolder = new HashMap<String, Object>();

     private ServiceLocator() {
        try {
            Context ctx = new InitialContext();
            AVeDBService aveDBService = (AVeDBService) ctx.lookup(AVE_DB_SERVICE_JNDI_KEY);
            serviceHolder.put(AVE_DB_SERVICE, aveDBService);
          }

     }

}

现在,当我使用服务定位器获取服务的存根时,有时会出现以下异常。但只是有时:

Caused by: java.lang.ClassCastException: class at.home.digest.services.AVeDBService$$$view39 cannot be cast to class at.home.digest.services.AVeDBService (at.home.digest.services.AVeDBService$$$view39 is in unnamed module of loader 'deployment.heimdi.war' @658d7dca; at.home.digest.services.AVeDBService is in unnamed module of loader 'deployment.heimdi.war' @15cdf490)

我在同一场战争中使用我的服务。模块,在其中声明它(相同的 Web 应用程序)。但是尽管如此,全局查找应该始终有效,或者?这可能是 WildFly 17.0 中的错误吗?我在类似的相关问题中找不到答案,例如:

Glassfish 上 EJB 的便携式 JNDI 语法查找

Java ee 6/7中模块和应用程序的jndi绑定有什么区别?

无法转换为类,因为它们位于加载程序“app”的未命名模块中

谢谢!

4

2 回答 2

0

我对 Wildfly 24.1 有同样的问题,问题是 EAR 项目中类的类加载器,我必须按照提供的方式更改 WAR 的 POM 中 EJB 的依赖关系,所以最终的 EAR 只包含 EJB 的一个副本课,这解决了我的问题

POM 示例

于 2021-09-08T01:07:36.273 回答
0

当我想在 Wildfly 21 上部署一个耳朵时,我遇到了同样的问题。我所要做的就是将我的@Local注释更改为我@Remote所有的 Sessions Bean

于 2021-04-22T16:43:13.400 回答