我的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); }
用户名和密码都是应用程序用户凭据,而不是管理权限!这是正确的吗?
我收到此错误:
线程“主”中的异常java.lang.IllegalStateException:EJBCLIENT000025:没有EJB接收器可用于处理调用上下文org.jboss.ejb.client.EJBClientInvocationContext@5034c75a的[appName :, moduleName:EjbComponent,distinctName:]组合org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:128)处的.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:798)org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java :186),位于org.jboss.ejb.client.EJBInvocationHandler.sendRequestWithPossibleRetries(EJBInvocationHandler.java:255),位于org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:200),位于org.jboss.ejb.client。 EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:183)在org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:146)在com.sun.proxy。$ Proxy2.addBook(未知源)在com.studio.java.client.EjbTester.invokeStatelessBean(EjbTester .java:34),位于com.studio.java.client.EjbTester.main(EjbTester.java:21)
我不知道为什么!有人有主意吗?
之所以收到上述错误,是因为您尝试使用绝对JNDI名称访问远程EJB。
如文档所述:
在 HTTP的远程处理 客户端假设在远程查找JNDI名称是相对于java的:JBoss的/导出的命名空间,绝对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 / 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语法以及WildFly的JNDI参考。
关于您的凭证,由于您的EJB不需要任何类型的身份验证即可访问它们,因此它们不是必需的。通常,仅在例如拥有使用LDAP服务提供商的应用程序时才需要这样做。