para - java ee tutorial
cómo crear una sesión remota EJB desde un cliente (1)
Empecé desde cero. La única diferencia que puedo pensar es que en vez de hacer una aplicación EJB, acabo de crear un módulo EJB para el bean. De lo contrario, creo que es lo mismo.
estructura:
thufir@dur:~/NetBeansProjects$
thufir@dur:~/NetBeansProjects$ tree HelloLibrary/
HelloLibrary/
├── build.xml
├── nbproject
│ ├── build-impl.xml
│ ├── genfiles.properties
│ ├── private
│ │ └── private.properties
│ ├── project.properties
│ └── project.xml
└── src
└── hello
└── HelloBeanRemote.java
4 directories, 7 files
thufir@dur:~/NetBeansProjects$
thufir@dur:~/NetBeansProjects$ tree HelloEJB/
HelloEJB/
├── build.xml
├── nbproject
│ ├── ant-deploy.xml
│ ├── build-impl.xml
│ ├── genfiles.properties
│ ├── private
│ │ └── private.properties
│ ├── project.properties
│ └── project.xml
└── src
├── conf
│ └── MANIFEST.MF
└── java
└── hello
└── HelloBean.java
6 directories, 9 files
thufir@dur:~/NetBeansProjects$
thufir@dur:~/NetBeansProjects$ tree HelloClient/
HelloClient/
├── build.xml
├── nbproject
│ ├── ant-deploy.xml
│ ├── build-impl.xml
│ ├── genfiles.properties
│ ├── private
│ │ └── private.properties
│ ├── project.properties
│ └── project.xml
├── src
│ ├── conf
│ │ ├── application-client.xml
│ │ └── MANIFEST.MF
│ └── java
│ └── helloclient
│ └── Main.java
└── test
7 directories, 10 files
thufir@dur:~/NetBeansProjects$
thufir@dur:~/NetBeansProjects$
codigo del cliente:
package helloclient;
import hello.HelloBeanRemote;
import javax.ejb.EJB;
public class Main {
@EJB
private static HelloBeanRemote helloBean;
public static void main(String... args) {
System.out.println(helloBean.Hi());
}
}
frijol:
package hello;
import javax.ejb.Stateless;
@Stateless
public class HelloBean implements HelloBeanRemote {
@Override
public String Hi() {
return "hello world";
}
@Override
public String Bye() {
return "goodbye";
}
}
interfaz remota:
package hello;
import javax.ejb.Remote;
@Remote
public interface HelloBeanRemote {
public String Hi();
public String Bye();
}
De acuerdo con el Tutorial de Netbeans en las aplicaciones del Cliente EJB , parece que no puedo invocar el método:
Error de compilación:
-do-compile:
[mkdir] Created dir: /home/thufir/NetBeansProjects/EntAppClient/build/empty
[mkdir] Created dir: /home/thufir/NetBeansProjects/EntAppClient/build/generated-sources/ap-source-output
[javac] Compiling 1 source file to /home/thufir/NetBeansProjects/EntAppClient/build/jar
[javac] /home/thufir/NetBeansProjects/EntAppClient/src/java/entappclient/Main.java:16: error: cannot find symbol
[javac] System.err.println("result = " + mySession.getResult());
[javac] ^
[javac] symbol: method getResult()
[javac] location: variable mySession of type MySessionRemote
[javac] 1 error
BUILD FAILED
cliente:
package entappclient;
import ejb.MySessionRemote;
import javax.ejb.EJB;
public class Main {
@EJB
private static MySessionRemote mySession;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
System.err.println("result = " + mySession.getResult());
}
}
ejb:
package ejb;
import javax.ejb.Stateless;
@Stateless
public class MySession implements MySessionRemote {
public String getResult() {
return "This is My Session Bean";
}
}
interfaz remota:
package ejb;
import javax.ejb.Remote;
@Remote
public interface MySessionRemote {
}
ahora, si la interfaz se modifica:
package ejb;
import javax.ejb.Remote;
@Remote
public interface MySessionRemote {
public String getResult();
}
el bean ahora puede @Override
el método:
package ejb;
import javax.ejb.Stateless;
@Stateless
public class MySession implements MySessionRemote {
@Override
public String getResult() {
return "This is My Session Bean";
}
}
sin embargo, hay un NPE:
-run:
[java] java.lang.reflect.InvocationTargetException
[java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
[java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[java] at java.lang.reflect.Method.invoke(Method.java:606)
[java] at org.glassfish.appclient.client.acc.AppClientContainer.launch(AppClientContainer.java:446)
[java] at org.glassfish.appclient.client.AppClientFacade.main(AppClientFacade.java:166)
[java] Caused by: java.lang.NullPointerException
[java] at entappclient.Main.main(Main.java:16)
[java] ... 6 more
[java] Java Result: 1
run:
BUILD SUCCESSFUL
Total time: 18 seconds
thufir@dur:~/NetBeansProjects/EntAppClient$
¿Cómo puedo invocar el método correctamente? ¿El EJB no está instanciado?