我使用 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绑定有什么区别?
谢谢!