cs_fanfan78
Messages postés9Date d'inscriptiondimanche 12 juin 2005StatutMembreDernière intervention22 juin 2005
-
21 juin 2005 à 18:09
cs_mclane1
Messages postés2Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention30 juin 2009
-
18 oct. 2005 à 19:13
Bonjour !!
je découvre les EJB ! pour cela j'essaye de lancer ce programme qui doit invoquer la méthode métier sur mon bean session appelé MonBean :
/**
* @author Administrateur
*
* TODO Pour changer le modèle de ce commentaire de type généré, allez à :
* Fenêtre - Préférences - Java - Style de code - Modèles de code
*/
public class TestSimpleBean {
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.lookup(Unknown Source)
at com.test.TestSimpleBean.main(TestSimpleBean.java:31)
Akbarr
Messages postés15Date d'inscriptionmercredi 15 juin 2005StatutMembreDernière intervention23 juin 20051 21 juin 2005 à 18:36
Lors de la création de ton context en dehors de ton 'application server', ce qui est le cas ici puisque tu lances une petit application de test, tu ne peux pas faire un simple new InitialContext().
Tu dois lui passer une liste de propriétés (ou alors elles sont défini comme system property mais c'est moins courrant).
Les propriétés à passer sont:
Context.INITIAL_CONTEXT_FACTORY: lié au type d'application server;
Context.PROVIDER_URL: URL du serveur;
Context.SECURITY_PRINCIPAL: le user (défini sur l'application server) qui va interagir avec l'EJB;
Context.SECURITY_CREDENTIALS: son mot de passe.
Exemple (sous WebLogic):
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
p.put(Context.PROVIDER_URL, "http://localhost:7001");
p.put(Context.SECURITY_PRINCIPAL, "system");
p.put(Context.SECURITY_CREDENTIALS, "password");
InitialContext ctx = new InitialContext(p);
cs_fanfan78
Messages postés9Date d'inscriptiondimanche 12 juin 2005StatutMembreDernière intervention22 juin 2005 22 juin 2005 à 11:04
Hello,
tout d'abord merci pour ton aide !! ^^
Mais en fait je ne comprend pas ta réponse, d'ailleur je ne comprend pas mon problème ... Je ne comprend pas ce que je fais non plus d'ailleur !!!!!
J'étudie un bouquin en fait, donc je vais tenter de résumer ce que j'ai compris.
J'essaye de construire un bean stateless appelé à partir d'une application java, pour ce faire il faut que je passe par plusieurs étapes.
On me parle d'interface de composant, d'interfaces d'acceuil et de fichier de classe d'EJB. J'utilise MyEclipse et Xdoclet, ses différentes interfaces sont généré automatiquement. Pareil pour le descripteur de déploiement jboss.xml (enfin je crois) et le fichier descripteur ejb-jar.xml. Bref le seul code que j'ai rentré c'est mon fichier MonEJBSession.java et TestSimpleBean.java.
Du coup je suis un peu dans le flou, pouvez vous m'éclairer de votre lumière ???
Akbarr
Messages postés15Date d'inscriptionmercredi 15 juin 2005StatutMembreDernière intervention23 juin 20051 22 juin 2005 à 14:22
Pour faire simple et sans rentrer dans les détails, ton EJB tourne dans un serveur applicatif (JBoss). Celui-ci lui fournit un conteneur d'execution qui offre une série de services comme gestion de la sécurité, gestion des transactions, gestion des pool de Connection vers des Db, gestion des appels //, ... que tu ne dois dès lors pas directement implémenter mais simplement décrire dans un descripteur de déploiement (principes définit par J2EE).
Afin de pouvoir accéder à ton EJB tu dois fournir des interfaces définissant d'une part le type d'EJB instancié (interface d'acceuil) et d'autre part quelles méthodes sont accessible (interface de composant). Effectivement tout ça peut être facilement automatisé si tu prends la convention de dire par exemple que toutes tes méthodes public font parties de ton interface.
Ces interfaces doivent être fournies à toute application désirant accèder ton EJB.
Une fois ton EJB déployé sur ton serveur applicatif, tu voudrais y accèder. Mais, à priori ton application ne sait pas où est ton EJB, elle ne dispose que de ses interfaces. C'est à ça que sert le JNDI du serveur applicatif, il offre une description des resources qui y sont déployées (entre autre les EJBs).
Donc, pour accèder à ton EJB, tu accèdes le JNDI du serveur en établissant un context de connection (le new InitialContext()) et tu demande l'accès à une resource (le lookup pour obtenir le home de ton EJB). Ayant le home de ton EJB tu utilises un create qui te permet d'accèder de ton programme à l'EJB qui tourne effectivement sur le serveur; tout le protocole de communication 'rmi' étant transparent pour toi.
Par défault, des serveurs web ou des serveurs applicatifs initialisent une série de variables d'environement qui permettent à une servlet ou un EJB qu'ils tournent de faire un simple new InitialContext() pour accèder à leur JNDI.
Dans ton cas, ton programme tourne à l'extérieur de ces serveurs, donc tu dois dire lors de la création du contexte de connection comment et quel JNDI tu veux accèder. Ceci se fait en passant une série de paramètres bien définis à la création du contexte. Ces paramètres disent entre autre où est le serveur, quel est le type du serveur et éventuellement quel user tu veux utiliser pour y accèder.
Tu dois donc changer la partie de ton code: InitialContext ctx = new InitialContext();
Pour JBoss, je ne suis pas sûr des paramètres à passer, tu peux essayer ceux-là:
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
p.put(Context.PROVIDER_URL, "localhost:1099");
InitialContext ctx = new InitialContext(p);
Le reste de ton code semble à première vue correcte.
JNDI API lookup failed: javax.naming.NoInitialContextException: Need
to specify class name in environment or system property, or as an
applet parameter, or in an application resource file:
java.naming.factory.initial
C'est la parti soulignée qui est importante.
Ca fait une semaine que je suis la dessus... Et je n'arrive pas a savoir d'ou ca vient...
Il me reste moins d'une semaine.
Pour finir... je tourne avec JBoss 4.0 et je lance mes prog en ligne de commande (sous windows cela va sans dire) .
(Pour verifier les erreurs je tourne sous eclipse mais je recompil tjs à la main)...