您收到上述错误是因为您尝试使用绝对 JNDI 名称访问远程 EJB。
正如所指出的文档 https://docs.jboss.org/author/display/WFLY10/Remote+JNDI+Reference+Update+Draft:
The http 远程处理客户端假设远程查找中的 JNDI 名称相对于 java:jboss/exported 命名空间,则绝对 JNDI 名称的查找将失败。
因此,在 WildFly 上部署应用程序后,您应该在服务器控制台上看到类似以下内容:
JNDI bindings for session bean named NewSessionBean in deployment unit deployment <your_deployment_unit> are as follows:
java:global[/<application_name>]/<module_name>/<ejb_name>[!<interface_name>]
java:app[/<module_name>]/<ejb_name>[!<interface_name>]
java:module/<ejb_name>[!<interface_name>]
java:jboss/exported[/<application_name>]/<module_name>/<ejb_name>[!<interface_name>]
java:global/[/<application_name>]/<module_name>/<ejb_name>
java:app[/<module_name>]/<ejb_name>
java:module/<ejb_name>
因此,考虑到java:jboss/导出根据上下文,获得 EJB 的正确方法应该是:
// Normally the appName is the EAR name
// Leave it empty if your application isn't packaged in a EAR
String appName = "your_application_name/";
// The EJB module name
String moduleName = "ejb_module_name/";
String beanName = NewSessionBean.class.getSimpleName();
String viewClassName = NewSessionBeanRemote.class.getName();
(NewSessionBeanRemote) context.lookup(appName + moduleName + beanName + "!" + viewClassName);
为了进一步阅读,我建议您还看一下Java EE JNDI 语法 https://docs.oracle.com/javaee/7/tutorial/ejb-intro004.htm#GIPJF以及WildFly 的 JNDI 参考 https://docs.jboss.org/author/display/WFLY10/JNDI+Reference.
至于您的凭据,它们不是必需的,因为您的 EJB 不需要任何类型的身份验证即可访问它。通常,只有当您拥有一个使用LDAP 服务提供商 http://docs.oracle.com/javase/jndi/tutorial/ldap/security/ldap.html.