cómo crear una sesión remota EJB desde un cliente

De acuerdo con el Tutorial de Netbeans en las aplicaciones del Cliente EJB , parece que no puedo invocar el método:

Error de comstackció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?

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(); }