Как получить доступ к EJB из приложения JSF на отдельных машинах? - PullRequest
3 голосов
/ 21 мая 2011

У меня есть корпоративное приложение с EJB, реализующим бизнес-интерфейс @Remote, к которому я хотел бы получить доступ из управляемого бина JSF на другом компьютере.Они оба являются машинами для разработки с Netbeans 7 и Glassfish 3.1.Я считаю, что ответ лежит на CORBA, но я не думаю, что я делаю это правильно.

Есть ли лучший вариант, чем CORBA для этого?

Вот где я нашел, как использовать corbaname: iiop http://download.oracle.com/docs/cd/E19798-01/821-1752/beanv/index.html

Это мой интерфейс EJB:

package remote.ejb;

import javax.ejb.Remote;

@Remote
public interface HelloRemote {
    public String getHello();
}

Приложение для предприятия: RemoteEJBTest Java EE Модуль: RemoteEJBTest-ejb

EJB:

package remote.ejb;

import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateless;

@Stateless
public class HelloBean implements HelloRemote {

    @Override
    public String getHello() {
        return "Hello World!";
    }
}

Веб-приложение: 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();
    }
}

Вот трассировка стека http://pastebin.com/PxNCKCg4

соответствующие части трассировки стека:

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 на несколько удаленных машин?

Ответы [ 2 ]

2 голосов
/ 21 мая 2011

Хм ... Я думаю, что вы пропустили пару шагов здесь.

Сначала вам нужно создать запись ejb-ref в glassfish-web.xml следующим образом:

<ejb-ref>
   <ejb-ref-name>ejb/Foo</ejb-ref-name>
   <jndi-name>corbaname:iiop:host:port#a/b/Foo</jndi-name>
<ejb-ref>

Во-вторых, вы напрямую ссылаетесь на имя ejb.

Context ic = new InitialContext();
Object o = ic.lookup("java:comp/env/ejb/Foo");

И поскольку вы используете контейнер Java EE с поддержкой EJB 3.1, почему бы вам не внедрить EJB непосредственно в управляемый компонент с помощью @EJB (я думаю, что это намного чище, чем поиск JNDI):

@EJB(name="your-ref-name")
BeanRemoteInterface beanRemoteInterface; 

Посмотрите здесь для получения дополнительной информации: http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#cross-appserverremoteref

0 голосов
/ 17 декабря 2013

Хороший образец здесь: Разработка автономных клиентов для Oracle WebLogic Server http://docs.oracle.com/middleware/1212/wls/SACLT/j2se.htm

...