Fiz deploy de um EJB 3.0 Session Bean Stateless no JBoss 4.0.4-GA como um pacote JAR e consigo fazer o lookup remoto (outra JVM) numa boa, somente pelo nome da classe.
Agora, se eu faço o deploy do EJB dentro de um pacote EAR, ele não acha mais o EJB (name not bound).
Ter, tem. Tu poderia usar as anotações @RemoteBinding e @LocalBinding, pra garantir que o seus EJBs vão manter os mesmos endereços JNDI, independente de como eles foram empacotados.
O problema é que JEE/EJB nunca definiu como um componente deveria ser bindado no JNDI. Ou seja, mesmo se tu encontrar uma configuração do Jboss para que ele binde da mesma forma, sendo local ou remote, se você colocar no XPTO aplication server, ele pode bindar da forma que quizer, e lá se vai tua liberdade.
Já conheço o EJB 2.1 e agora estou estudando o 3.0.
Baixei o NetBeans 5.5 beta 2 com o Glassfish.
Fiz uma aplicação simples - e depois testei um dos exemplos
embutidos no NetBeans - com um EJB Stateless, mas o cliente
não consegue acessar o EJB: recebo uma NullPointerException ao
tentar usar a referência para o meu SessionBean, que, teoricamente,
não estaria Null devido à Injeção de Dependência.
Irei mostrar o código cliente, que é bastante simples:
public class Login {
@EJB
private static LoginRemote loginRemote;
public static void main(String args[]) {
Login login = new Login();
String test = new String("thyago");
login.callMeth(test);
}
public void callMeth(String teste) {
try {
System.out.println("Trying to log in the system...");
loginRemote.login(teste);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Depois de fazer o deploy, eu executo o código cliente e recebo uma NullPointer no “loginRemote.login(teste)”. Repito que a própria aplicação do NetBeans também lançou um NullPointer.
Cara, brigado pela ajuda! Eu fiz isso ae em um computador na faculdade e funcionou, mas quando cheguei em casa e repeti o mesmo código o JBoss lança uma exceção:
Exception in thread "main" java.lang.NoClassDefFoundError: [Lorg/jboss/aop/advice/Interceptor;
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Class.java:2259)
at java.lang.Class.getDeclaredField(Class.java:1852)
at java.io.ObjectStreamClass.getDeclaredSUID(ObjectStreamClass.java:1582)
at java.io.ObjectStreamClass.access$700(ObjectStreamClass.java:52)
at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:408)
at java.security.AccessController.doPrivileged(Native Method)
at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:400)
at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:297)
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:531)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1552)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1466)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1552)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1466)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1552)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1466)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1699)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1908)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1832)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1719)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
at java.rmi.MarshalledObject.get(MarshalledObject.java:135)
at org.jnp.interfaces.MarshalledValuePair.get(MarshalledValuePair.java:72)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:652)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:587)
at javax.naming.InitialContext.lookup(InitialContext.java:351)
at teste.HelloCliente.main(HelloCliente.java:31)