Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不同的机器上从JSF应用程序访问EJB?_Java_Ejb_Java Ee 6_Glassfish 3 - Fatal编程技术网

Java 如何在不同的机器上从JSF应用程序访问EJB?

Java 如何在不同的机器上从JSF应用程序访问EJB?,java,ejb,java-ee-6,glassfish-3,Java,Ejb,Java Ee 6,Glassfish 3,我有一个企业应用程序,它带有一个EJB,实现了一个@Remote business接口,我希望从另一台机器上的JSF托管bean访问该接口。它们都是带有Netbeans 7和Glassfish 3.1的开发机器。我相信答案在于CORBA,但我认为我做得不对 有没有比CORBA更好的选择 这里是我发现如何使用corbaname:iiop的地方 这是我的EJB接口: package remote.ejb; import javax.ejb.Remote; @Remote public inter

我有一个企业应用程序,它带有一个EJB,实现了一个@Remote business接口,我希望从另一台机器上的JSF托管bean访问该接口。它们都是带有Netbeans 7和Glassfish 3.1的开发机器。我相信答案在于CORBA,但我认为我做得不对

有没有比CORBA更好的选择

这里是我发现如何使用corbaname:iiop的地方

这是我的EJB接口:

package remote.ejb;

import javax.ejb.Remote;

@Remote
public interface HelloRemote {
    public String getHello();
}
企业应用程序:RemoteEJBTest JavaEE模块:RemoteEJBTestEJB

EJB:

Web应用程序:RemoteWebTest

package hello.web;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import remote.ejb.HelloRemote;

@ManagedBean
@RequestScoped
public class Hello {
    private HelloRemote helloBean;

    private String hello;

    public Hello() throws NamingException {

        InitialContext ctx = new InitialContext();

        Object obj = ctx.lookup("corbaname:iiop:remote_ip:3700#RemoteEJBTest/RemoteEJBTest-egb/HelloBean");
        helloBean = (HelloRemote) PortableRemoteObject.narrow(obj,HelloRemote.class);
    }

    public String getHello(){
        return helloBean.getHello();
    }
}
这是堆栈跟踪

堆栈跟踪的相关部分:

com.sun.faces.mgbean.ManagedBeanCreationException: Cant instantiate class: hello.web.Hello.
    at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:193)
    at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:102)

Caused by: javax.naming.NameNotFoundException [Root exception is org.omg.CosNaming.NamingContextPackage.NotFound: IDL:omg.org/CosNaming/NamingContext/NotFound:1.0]
    at com.sun.jndi.cosnaming.ExceptionMapper.mapException(ExceptionMapper.java:44)
    at com.sun.jndi.cosnaming.CNCtx.callResolve(CNCtx.java:485)

Caused by: org.omg.CosNaming.NamingContextPackage.NotFound: IDL:omg.org/CosNaming/NamingContext/NotFound:1.0
    at org.omg.CosNaming.NamingContextPackage.NotFoundHelper.read(NotFoundHelper.java:72)
    at org.omg.CosNaming._NamingContextStub.resolve(_NamingContextStub.java:251)
    at com.sun.jndi.cosnaming.CNCtx.callResolve(CNCtx.java:471)
... 59 more

在多台远程机器上拆分EJB的最佳方法是什么?

哼。。。我想你错过了几步

首先,您需要在glassfish-web.xml中创建一个ejb引用入口,如下所示:

<ejb-ref>
   <ejb-ref-name>ejb/Foo</ejb-ref-name>
   <jndi-name>corbaname:iiop:host:port#a/b/Foo</jndi-name>
<ejb-ref>
既然您使用的是支持EJB3.1的JavaEE容器,为什么不使用@EJB将EJB直接注入托管bean中(我认为它比JNDI查找要干净得多):

查看此处以了解更多信息:

这里的示例很好: 为Oracle WebLogic Server开发独立客户端

注射确实是一种更好的获取EJB@Mike,也看看这里:我以前试过这个,但认为会有更多的错误空间。我认为问题出在我的corbaname url上:
“corbaname:iiop:146.57.148.233:3700#RemoteEJBTest/RemoteEJBTest ejb/HelloBean”
。它与本地主机上的corbaname:iiop:146.57.148.233:3700#java:global/RemoteEJBTest/RemoteEJBTest ejb/HelloBean一起工作。这就是我在使用glassfish-web.xml和@EJB时遇到的错误。请检查远程服务器JNDI树,查看EJB是否正确部署,并检查EJB全局名称。尝试从独立客户端使用CORBA url进行JNDI查找(参见Glassfish常见问题解答),看看计算机之间的通信是否正常工作。@Mike。试试
corbaname:iiop:146.57.148.233:3700#[限定的全名]
,比如
corbaname:iiop:146.57.148.233:3700#com.something.HelloBean
。请看这里:
<ejb-ref>
   <ejb-ref-name>ejb/Foo</ejb-ref-name>
   <jndi-name>corbaname:iiop:host:port#a/b/Foo</jndi-name>
<ejb-ref>
Context ic = new InitialContext();
Object o = ic.lookup("java:comp/env/ejb/Foo");
@EJB(name="your-ref-name")
BeanRemoteInterface beanRemoteInterface;