导致原因:javax.naming.NamingException:WFLYNAM0027:实例化InitialCont



我在JBoss服务器上部署了一个Java应用程序,该服务器允许使用WebSphere MQ提供的资源适配器连接到WebSphere MQ服务器。在应用程序启动期间,我遇到了问题Caused by: javax.naming.NamingException: WFLYNAM0027: Failed instantiate InitialContextFactory:

at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:360)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378)
at java.lang.Thread.run(Thread.java:748)
Caused by: javax.naming.NamingException: WFLYNAM0027: Failed instantiate InitialContextFactory com.ibm.websphere.naming.WsnInitialContextFactory from classloader ModuleClassLoader for Module "JmsTest.war" from Service Module Loader [Root exception is java.lang.ClassNotFoundException: com.ibm.websphere.naming.WsnInitialContextFactory from [Module "deployment.JmsTest.war" from Service Module Loader]]

下面是我的java代码:

Properties properties = new Properties();
properties.put(Context.SECURITY_PRINCIPAL, user);
properties.put(Context.SECURITY_CREDENTIALS, password);
properties.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
properties.put(Context.URL_PKG_PREFIXES, "com.ibm.ws.naming");
properties.put(Context.PROVIDER_URL,  "remote://192.16.70.10:1234");
namingContext = new InitialContext(properties);
MQConnectionFactory cf = new MQConnectionFactory();
cf.setTransportType(WMQConstants.WMQ_CM_CLIENT);
cf.setHostName(mqHostName);
cf.setPort(Integer.parseInt(mqListenerPort));
cf.setQueueManager(mqQueueManagerName);
cf.setChannel(mqChannelName);
MQConnectionFactory factory = cf;
connection = factory.createConnection(user, password);
connection.start();
sessionConsumer = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
queue = namingContext.lookup(queue);

有人能帮我吗?任何建议都将不胜感激!

根本原因是:

java.lang.ClassNotFoundException: com.ibm.websphere.naming.WsnInitialContextFactory

这意味着应用程序的类加载器找不到此类。

但是,使用JCA资源适配器的主要好处之一是您不需要在代码中包含特定于提供者的详细信息。换句话说,您根本不应该在应用程序代码中直接在WebSphereMQ上查找JNDI资源。所有这些东西都应该通过您部署的JCA资源适配器进行配置并绑定到JNDI中。然后,您可以执行本地JNDI查找,以访问远程WebSphereMQ服务器上的资源。然后,您的应用程序将不需要访问任何特定于提供者的类或配置详细信息。它可以直接使用Java EE API,因为它们是为使用而设计的。

最新更新