Je suis nouveau à l'EJB et j'essayais "Hello World" type de programme Java EJB. Voici mon EJB:
Properties prop = new Properties();
prop.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
prop.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
prop.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
try {
InitialContext ctx = new InitialContext(prop);
ctx.lookup("ejb/BookRequestBean");
System.out.println("EJB Look-up successfull!!");
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
4 Réponses :
Il peut y avoir plusieurs raisons à ceci: p>
EJB code> n'est pas mappé sur jndi em> nom. Vous devez vérifier si votre EJB code> est déployé avec succès et il est mappé sur jndi em> nom. Vous pouvez vérifier GUI code>, Connexion au serveur sur le démarrage code> ou utiliser client de test universel code> pour voir si EJB code> est mappé correctement . Remarque, UTC code> ne montrera que exposé à distance em> éjbs. P>
EJB code> est uniquement exposé à application locale em>. Dans ce cas, appel à distance em> ou Appel d'application croisé em> (autre oreille, guerre ...) à votre EJB code> échouera. Dans ce scénario, créez interface distante em> et l'expose. Interface locale EM> expose EJB aux appels locaux uniquement. Interface distante EM> expose EJB à Télécommande em> ou Appels d'application croisée em>. p>.
rmi / iop code> port em> peut être incorrect. Vous pouvez vérifier Glassfish GUI code> ou Startup Server LOG CODE> Pour voir ce que port em> rmi / iop code> est attribué à. p>
En plus de Nice @Ravitrivei Réponse, voici quelques réflexions: p>
@Named code> Annotation ne doit pas être utilisé de cette façon li>
- n'utilise pas les deux
nom code> et MappeName code>, pour Glassfish, il suffit d'utiliser juste MappeName code> li>
- Votre EJB doit implémenter une interface distante li>
ul>
Légère interjection. Nom code> est utilisé pour identifier EJB here que MappeName code> est le nom JNDI de EJB. Aussi mappeName code> est spécifique au fournisseur. IE: Supports de gishfish, WebSphere non.
@Ravitrivedi Yep, c'est pourquoi j'ai noté que cela suffit pour les poissons de verre. Il ne doit pas être utilisé si vous souhaitez des applications entièrement portables.
Ajout à @Ravi Trivedi et @miljen Mikic, si vous utilisez Glassfish, vous devriez vérifier comment votre EJB est enregistré dans JNDI. Dans Glassfish, par exemple, tapez la commande suivante:
**This Remote interface (the only addition to your above code);**
import javax.ejb.Remote;
@Remote
public interface BookRequestI {
//Other codes here
String getISBN();
}
**your existing implementation spiced with my getISBN() to prove the point :)**
import javax.ejb.Stateless;
@Stateless(name="BookRequestBean", mappedName="ejb/BookRequestBean")
public class BookRequest implements BookRequestI {
//Other codes here
@Override
public String getISBN(){
return "ISBN 87 - 11 - 07559 - 7";
}
}
**your test as is with my getISBN and typing to interface Type.**
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Properties;
public class BookRequestT {
public static void main(String[] args) {
Properties prop = new Properties();
prop.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
prop.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
prop.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
try {
Context ctx = new InitialContext(prop);
BookRequestI bookRequest = (BookRequestI) ctx.lookup("ejb/BookRequestBean");
System.out.println("EJB Look-up successfull!!" + bookRequest.getISBN());
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
output:
EJB Look-up successfull!!ISBN 87 - 11 - 07559 - 7
Process finished with exit code 0
Full StackTrace aiderait. Assurez-vous également de regarder ceci: Glassfish.java.net/javaee5/ejb/ Ejb_faq.html # pojolocalejb