Java EJB3的JNDI初始上下文和查找问题

Java EJB3的JNDI初始上下文和查找问题,java,jakarta-ee,jboss,ejb,ejb-3.0,Java,Jakarta Ee,Jboss,Ejb,Ejb 3.0,这个问题很普遍。我读过一些文章,但没有发现问题。我想在EJB3.0、EclipseLuna、JBoss7.1.1 Final中创建一个简单的HelloWorld程序 这是我的豆子: package com.tcs.HelloWorldPack; import javax.ejb.Stateless; /** * Session Bean implementation class HelloWorld */ @Stateless(mappedName="HelloWorldBean") p

这个问题很普遍。我读过一些文章,但没有发现问题。我想在EJB3.0、EclipseLuna、JBoss7.1.1 Final中创建一个简单的HelloWorld程序

这是我的豆子:

package com.tcs.HelloWorldPack;

import javax.ejb.Stateless;

/**
 * Session Bean implementation class HelloWorld
 */
@Stateless(mappedName="HelloWorldBean")
public class HelloWorld implements HelloWorldRemote {

    /**
     * Default constructor. 
     */
    public HelloWorld() {
        // TODO Auto-generated constructor stub

    }

    @Override
    public void displayMsg() {
        // TODO Auto-generated method stub 
        System.out.println("Hello World!!");

    }

}
这是我的远程接口:

package com.tcs.HelloWorldPack;

import javax.ejb.Local;
//import javax.ejb.Remote;
import javax.ejb.Remote;

@Remote
public interface HelloWorldRemote {

    void displayMsg();
}
这是在同一台机器上运行的我的客户端:

package com.tcs.HelloWorldClient;

import java.util.Hashtable;
import java.util.Properties;

import com.tcs.HelloWorldPack.*;

import javax.ejb.EJB;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class HelloWorldClient {


    public static void main(String[] args) throws NamingException {


        final Hashtable jndiProperties = new Hashtable();
        jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
        jndiProperties.put(javax.naming.Context.SECURITY_PRINCIPAL, "myUser");
        jndiProperties.put(javax.naming.Context.SECURITY_CREDENTIALS, "myPass");
//        jndiProperties.put(javax.naming.Context.PROVIDER_URL, "jnp://localhost:1099");
//        jndiProperties.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
        jndiProperties.put("jboss.naming.client.ejb.context", true);

        final Context context = new InitialContext(jndiProperties);

        final String appName= "HeloWorldEJBEAR";
        final String moduleName= "";
        final String distinctName ="";
        final String beanName = "HeloWorld";
        final String viewClassName = "com.tcs.HelloWorldPack.HelloWorldRemote";
        HelloWorldRemote hello = (HelloWorldRemote) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName);

        hello.displayMsg();


    }

}
这是我的jboss-ejb-client.properties文件:

remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false

remote.connections=default

remote.connection.default.host=localhost
remote.connection.default.port = 4447
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false

remote.connection.default.username=myUser
remote.connection.default.password=myPass
我也将属性文件放在类路径中。但在我尝试运行它时,会发生这种情况:

Exception in thread "main" java.lang.IllegalStateException: No EJB receiver available for handling [appName:HeloWorldEJBEAR,modulename:,distinctname:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@413ded77
    at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:584)
    at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:119)
    at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:181)
    at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:136)
    at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:121)
    at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:104)
    at com.sun.proxy.$Proxy0.displayMsg(Unknown Source)
    at com.tcs.HelloWorldClient.HelloWorldClient.main(HelloWorldClient.java:71)
Jan 08, 2015 3:34:44 PM org.jboss.ejb.client.remoting.ChannelAssociation$ResponseReceiver handleEnd
INFO: Channel Channel ID de8d2aa6 (outbound) of Remoting connection 44477156 to localhost/127.0.0.1:4447 can no longer process messages

我还上传了我的目录结构。我对EJB概念还不熟悉。请帮我找出问题所在。提前感谢。

您的模块名称是一个空字符串,但模块名称在JNDI名称中不能是空字符串。 看

您必须设置ejb模块的名称.jar,不带.jar后缀

最后一个字符串moduleName=HeloWorldEJB

那么它应该会起作用

当你要做一个简单的例子时,让我们保持简单[KISS],你的大部分代码都是正确的捕获是客户机,我简化了客户机代码,在客户机希望中添加了我的注释。而且。。。。添加到EJB@javax.EJB.Statelessname=HelloWorldEJB//这是可移植的,没有锁定供应商。另一种选择是mappedName[从代码@StatelessmappedName=HelloWorldBean p中删除],我认为它更以weblogic和glassfish为中心。 确保类路径中有client.jar。这是您在intelija、eclipse或任何其他ide中创建EJB项目后必须添加的唯一jar。 我已经在glassfish容器中部署了EJB。一旦ear部署成功,运行客户端。 除了下面的代码,您不需要任何其他配置。这段代码是可移植的,应该可以在大多数容器上运行,但是惊喜是有趣的,请按原样运行,并让我知道。。。。。 一旦以下内容适用于您,您就可以根据您的项目需求添加其他jndi属性并继续。。。。。 ==============================

遥控器

包com.au.ejbs; 导入javax.ejb.Remote

@Remote
public interface HelloWorldI {
   String displayMessage(String message);
}




=================================
2. The Impl

package com.au.ejbs;

import javax.ejb.Remote;

@javax.ejb.Stateless(name = "HelloWorldEJB")
public class HelloWorld implements HelloWorldI {
    @Override
    public String displayMessage(String message) {
        // TODO Auto-generated method stub
        return "Returning from Remote" + message;
    }
}



======================================
3. The client

package com.au.clients;

import com.au.ejbs.HelloWorldI;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class HelloWorldT {

    public static void main(String[] args) throws NamingException {
        Context context = new InitialContext();
        HelloWorldI helloWorldI = (HelloWorldI)context.lookup("java:global/ejb3_2_ear_exploded/ejb/HelloWorldEJB");
        //portable syntax java:global/[ ear name]/[module name normally the jar name in my case ejb.jar within the ear, ejb3_2_ear_exploded]/name in ....javax.ejb.Stateless(name = "HelloWorldEJB")/
        System.out.println( "output " + helloWorldI.displayMessage("From Client with luv...."));
    }
}

===================
4. output
output Returning from RemoteFrom Client with luv....

您是否已将ejb模块添加到ejb客户端。对不起,我无法理解您的要求。我有一个与会话bean关联的EJB模块&我的客户机@Manoj sharmab的另一个EJB模块,但是我使用EAR而不是JAR部署了EJB。这就是为什么我一直保持moduleName为空。无论如何,我已经按照您的建议更改了模块名称。但问题仍然存在@USER3584190取消修复JNDIProperty.put和set时是否有效remote://localhost:4447 而不是jnp://localhost:1099. 在AS7中,使用remote://而不是jnp://Thank 你!!:是的,取消这两行的注释&更改url就成功了。但是你能解释一下这两行的意义吗?我是新来的EJB@SumitPal我还不太熟悉通过jndi进行远程EJB调用。在这个网站上,他们写道:这两个属性对于jboss远程命名项目与AS7服务器通信非常重要。第一个属性告诉。。。希望这对你有帮助。