当前位置: 首页 > 知识库问答 >
问题:

WildFly 17:java中的JNDI查找问题。类位于加载器的未命名模块中

井高峯
2023-03-14

我使用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)

我在同一个war.模块中使用我的服务,在其中声明(相同的网络应用程序)。但尽管如此,全局查找应该总是工作,还是?这可能是WildFly 17.0中的错误吗?我在类似的相关问题中找不到答案,例如:

Glassfish上EJB的可移植JNDI语法查找

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

无法转换为类,因为它们在加载器'app'的未命名模块中

非常感谢。

共有2个答案

戚升
2023-03-14

我在Wildfly 24.1中也遇到了同样的问题,问题是EAR项目中类的类加载器,我必须按照提供的那样更改WAR POM中EJB的依赖性,因此最终的EAR只包含EJB类的一个副本,这解决了我的问题

POM示例

彭存
2023-03-14

当我想在Wildfly 21上部署ear时,我也遇到了同样的问题。要解决这个问题,我所要做的就是在所有会话中将我的@Local注释更改为@Remote

 类似资料: