Annotation @EJB dans les clients
À l'aide de NetBeans, je ne le suit dans la classe contenant main()
et ça fonctionne:
import javax.ejb.EJB;
public class Master {
@EJB
TestBeanARemote x;
public static void main(String[] args) {
Master m = new Master();
m.doStuff();
}
//doStuff includes x, but it works, so who cares.
...
Si je fais ça dans une classe appelée, cependant, il échoue. Il semble qu'une classe appelée, m'oblige à éviter l'utilisation d'annotations et utilisez plutôt un tout InitialContext()
de l'installation.
String testRun(String arg) {
InitialContext ic;
try {
ic = new InitialContext();
x = (TestBeanARemote) ic.lookup("com.bnncpa.testing.TestBeanARemote");
return x.testRun(arg);
}
Le plein, à défaut de copie est ci-dessous:
package enterpriseapplication1;
public class Main {
private Secondary x = new Secondary();
public static void main(String[] args) {
Main m = new Main();
m.doStuff();
}
public void doStuff() {
System.out.println(x.testRun("bar"));
}
}
package enterpriseapplication1;
import org.mine.testing.TestBeanARemote;
import javax.ejb.EJB;
public class Secondary {
@EJB
static private TestBeanARemote x;
String testRun(String arg) {
return x.testRun(arg);
}
}
Est-il une raison particulière à @EJB
peut ne pas fonctionner dans toutes les classes d'un package? Je voudrais être en mesure de simplement marquer @EJB
partout où je suis en utilisant un.
Est-il une meilleure façon d'aller sur ce que je suis complètement absent?
Edit: Pour répondre à la préoccupation sur l'aide d'un appclient, voici mon stack trace:
May 11, 2009 4:24:46 PM com.sun.enterprise.appclient.MainWithModuleSupport <init>
WARNING: ACC003: Application threw an exception.
java.lang.NullPointerException
at enterpriseapplication1.Secondary.testRun(Secondary.java:20)
at enterpriseapplication1.Main.doStuff(Main.java:27)
at enterpriseapplication1.Main.main(Main.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.enterprise.util.Utility.invokeApplicationMain(Utility.java:266)
at com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:449)
at com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:259)
at com.sun.enterprise.appclient.Main.main(Main.java:200)
Exception in thread "main" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:461)
at com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:259)
at com.sun.enterprise.appclient.Main.main(Main.java:200)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.enterprise.util.Utility.invokeApplicationMain(Utility.java:266)
at com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:449)
... 2 more
Caused by: java.lang.NullPointerException
at enterpriseapplication1.Secondary.testRun(Secondary.java:20)
at enterpriseapplication1.Main.doStuff(Main.java:27)
at enterpriseapplication1.Main.main(Main.java:23)
... 8 more
Java Result: 1
source d'informationauteur Jeff Ferland | 2009-05-11
Vous devez vous connecter pour publier un commentaire.
Le problème est que @EJB ne seront injecté dans "gérer" les classes.
Dans Java EE il y a très peu de classes gérées. Notamment les Clients d'Application (votre "main" ici, dans ce cas), les Ejb (Stateless et Stateful Ejb, Message Haricots, etc.), et les Servlets.
Rien d'autre (c'est à dire les classes génériques, les entités JPA, etc.) n'aura pas les ressources injectées, et vous aurez besoin de s'appuyer sur le mécanisme de recherche pour obtenir l'accès à vos ressources.
Prend en charge Glassfish injection des Ejb dans les applications client ne s'exécute pas dans Java EE conteneur (votre petite app, Swing clients, etc.) à travers ce qui est appelé "client de l'application container".
Pour l'enregistrement, si je me souviens bien, nous avons eu à utiliser quelque chose comme
qui est utilisé dans la <=EJB 2.1 dans Weblogic 10, bien qu'il appuie et nous avons utilisé des EJB 3 (JavaEE 5). Il pense qu'il a été causé par Weblogic un moyen de soutenir la EJB3s en générant, dans les versions précédentes nécessaire, EJB 2.1 interfaces de style. Ne sais pas si ils ont déjà fixé.