JNDI 没有可用于处理的 EJB 接收器
JNDI No EJB receiver available for handling
我的 EJBTest 有问题。
我已经安装了WildFly并配置了用户管理和应用程序管理。
我写了一个 EJB 3.0 并部署了它:
@Stateless
@Remote(NewSessionBeanRemote.class)
public class NewSessionBean implements NewSessionBeanRemote {
List<String> bookShielf;
/**
* Default constructor.
*/
public NewSessionBean() {
bookShielf = new ArrayList<String>();
}
@Override
public void addBook(String bookName) {
bookShielf.add(bookName);
}
@Override
public List getBook() {
return bookShielf;
}
}
后来,我写了一个简单的客户端来连接它:
private static void invokeStatelessBean() throws NamingException {
// Let's lookup the remote stateless calculator
NewSessionBeanRemote remoteEjb = lookupRemoteSessionBean();
System.out.println("Obtained a remote stateless calculator for invocation");
String bookName = "TEST book";
remoteEjb.addBook(bookName);
}
private static NewSessionBeanRemote lookupRemoteSessionBean() throws NamingException {
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
jndiProperties.put(Context.PROVIDER_URL, "http-remoting://127.0.0.1:10090");
jndiProperties.put(Context.SECURITY_PRINCIPAL, "ejb"); //this is the application user name, not management! it's correct?
jndiProperties.put(Context.SECURITY_CREDENTIALS, "ejb");//this is the application password, not management! it's correct?
jndiProperties.put("jboss.naming.client.ejb.context", true);
final Context context = new InitialContext(jndiProperties);
final String appName = "";
final String moduleName = "EjbComponent";
final String distinctName = "";
final String beanName = NewSessionBean.class.getSimpleName();
final String viewClassName = NewSessionBeanRemote.class.getName();
System.out.println("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName);
return (NewSessionBeanRemote) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName);
}
用户名和密码都是应用用户凭证,不是管理!正确吗?
我收到此错误:
Exception in thread "main" java.lang.IllegalStateException: EJBCLIENT000025: No EJB receiver available for handling [appName:, moduleName:EjbComponent, distinctName:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@5034c75a
at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:798)
at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:128)
at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:186)
at org.jboss.ejb.client.EJBInvocationHandler.sendRequestWithPossibleRetries(EJBInvocationHandler.java:255)
at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:200)
at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:183)
at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:146)
at com.sun.proxy.$Proxy2.addBook(Unknown Source)
at com.studio.java.client.EjbTester.invokeStatelessBean(EjbTester.java:34)
at com.studio.java.client.EjbTester.main(EjbTester.java:21)
我不知道为什么!有人有想法吗?
您收到上述错误是因为您试图使用绝对 JNDI 名称访问远程 EJB。
如documentation所述:
The http-remoting client assumes JNDI names in remote lookups are relative to java:jboss/exported namespace, a lookup of an absolute JNDI name will fail.
因此,在 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/exported 上下文,获得 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 Syntax as well as to WildFly's JNDI Reference。
关于您的凭据,它们不是必需的,因为您的 EJB 不需要任何类型的身份验证即可让您访问它。通常,仅当您有一个使用 LDAP service provider.
的应用程序时才需要这样做
我的 EJBTest 有问题。
我已经安装了WildFly并配置了用户管理和应用程序管理。
我写了一个 EJB 3.0 并部署了它:
@Stateless
@Remote(NewSessionBeanRemote.class)
public class NewSessionBean implements NewSessionBeanRemote {
List<String> bookShielf;
/**
* Default constructor.
*/
public NewSessionBean() {
bookShielf = new ArrayList<String>();
}
@Override
public void addBook(String bookName) {
bookShielf.add(bookName);
}
@Override
public List getBook() {
return bookShielf;
}
}
后来,我写了一个简单的客户端来连接它:
private static void invokeStatelessBean() throws NamingException {
// Let's lookup the remote stateless calculator
NewSessionBeanRemote remoteEjb = lookupRemoteSessionBean();
System.out.println("Obtained a remote stateless calculator for invocation");
String bookName = "TEST book";
remoteEjb.addBook(bookName);
}
private static NewSessionBeanRemote lookupRemoteSessionBean() throws NamingException {
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
jndiProperties.put(Context.PROVIDER_URL, "http-remoting://127.0.0.1:10090");
jndiProperties.put(Context.SECURITY_PRINCIPAL, "ejb"); //this is the application user name, not management! it's correct?
jndiProperties.put(Context.SECURITY_CREDENTIALS, "ejb");//this is the application password, not management! it's correct?
jndiProperties.put("jboss.naming.client.ejb.context", true);
final Context context = new InitialContext(jndiProperties);
final String appName = "";
final String moduleName = "EjbComponent";
final String distinctName = "";
final String beanName = NewSessionBean.class.getSimpleName();
final String viewClassName = NewSessionBeanRemote.class.getName();
System.out.println("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName);
return (NewSessionBeanRemote) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName);
}
用户名和密码都是应用用户凭证,不是管理!正确吗?
我收到此错误:
Exception in thread "main" java.lang.IllegalStateException: EJBCLIENT000025: No EJB receiver available for handling [appName:, moduleName:EjbComponent, distinctName:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@5034c75a at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:798) at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:128) at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:186) at org.jboss.ejb.client.EJBInvocationHandler.sendRequestWithPossibleRetries(EJBInvocationHandler.java:255) at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:200) at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:183) at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:146) at com.sun.proxy.$Proxy2.addBook(Unknown Source) at com.studio.java.client.EjbTester.invokeStatelessBean(EjbTester.java:34) at com.studio.java.client.EjbTester.main(EjbTester.java:21)
我不知道为什么!有人有想法吗?
您收到上述错误是因为您试图使用绝对 JNDI 名称访问远程 EJB。
如documentation所述:
The http-remoting client assumes JNDI names in remote lookups are relative to java:jboss/exported namespace, a lookup of an absolute JNDI name will fail.
因此,在 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/exported 上下文,获得 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 Syntax as well as to WildFly's JNDI Reference。
关于您的凭据,它们不是必需的,因为您的 EJB 不需要任何类型的身份验证即可让您访问它。通常,仅当您有一个使用 LDAP service provider.
的应用程序时才需要这样做