IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Persistance des données Java Discussion :

Infos Annotations Stateless


Sujet :

Persistance des données Java

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 33
    Points : 24
    Points
    24
    Par défaut Infos Annotations Stateless
    Bonjour,
    Je voulais avoir des précisions sur les annotations de Stateless..
    Après tests et réflexions, j'en viens à la conclusion que c'est parce que je ne mets pas les annotations qui conviennent que j'ai un nullpointerexception au moment où j'essaye de récupérer des objets dans ma base.
    ( C'est d'ailleurs ce post du 5/11/2008 12:11 qui confirme mon idée : http://www.coderanch.com/t/414899/EJ...web-client-EJB )
    Pour info, j'ai utilisé ce tuto pour faire mon appli : http://www.isima.fr/~lacomme/JEE/part1/cours_JEE_1.pdf (Contexte EJB / JPA / DAO)
    Et dans le tuto, dans la classe DaoJpa on a : @Stateless(mappedName = "Interface")
    Sauf que " interface " ne correspond absolument à rien dans le contexte de son application...
    J'ai essayé de faire rentrer un peu tout et n'importe quoi dans cette case ("Idao","PiecesFacade","EJB_Tri_Hors_FluxPU" - ce dernier étant le PU name de mon persistance.xml). Mais finalement, je pense que c'est plus simple de poser la question et surtout de comprendre ce qu'on fait, et pour quelle raison.
    J'espère que vous pourrez m'aider,
    Merci,
    Marie

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 118
    Points : 94
    Points
    94
    Par défaut
    Salut,

    Sache juste que pour appeler l'annotation @Stateless dans ton EJB, tu dois préciser dans les interfaces la portée (Remote, Local) et ensuite, dans la (les ?) classes qui implémente ces interfaces, l'annotation @Stateless. Dans le cas du PDF que tu as mentionné, je pense que "Interface" doit être interpréter comme valeur où l'on doit indiquer soit l'interface Local, soit l'interface distante (Remote), comme il ne pouvais pas mettre les deux noms, il a laisser le mot "Interface".

    Pourrait-on avoir un morceau de code s'il te plait ?

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 33
    Points : 24
    Points
    24
    Par défaut
    Salut et merci pour ta réponse,

    Ce que tu me disais me semblait logique, c'est pourquoi j'ai suivi ton conseil, j'ai mis dans mon DaoJpa.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    @Stateless(mappedName = "IdaoLocal")
    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public class DaoJpa implements IdaoLocal, IdaoRemote {
        @PersistenceContext
        private EntityManager em;
        
         // liste des pieces
        @Override
        public List<Pieces> getAllPieces() {
        [...]
        }
    
        // ajouter une piece
        @Override
        public Pieces ajouterPiece(Pieces piece) {
        [...]
        }
        
    }
    Je me suis aussi aperçue que mon code de test était sans doute incorrect et je l'ai remplacé par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public class test2 {
     
        @EJB
        private static PiecesFacadeLocal pf;
     
        public static void main(String[] args) {      
     
            Context initialContext;
            try {
                PiecesPK pk=new PiecesPK("hhh","445");
                Pieces p=new Pieces(pk,"hhh", "jjk", "4555", "hhgf", "478522", "45855", 0);
     
                initialContext = new InitialContext();
                pf = (PiecesFacadeLocal) initialContext.lookup("ejb.PiecesFacadeLocal");
                pf.create(p);
            } catch (NamingException ex) {
                Logger.getLogger(test2.class.getName()).log(Level.SEVERE, null, ex);
            }
     
        }
    }
    Mais ce code ne fonctionne pas non plus...
    Je peux déployer mon projet sans problème, par contre quand je fais run file sur ma classe test2, j'ai ces messages :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    run:
    juil. 31, 2014 11:43:35 AM test.test2 main
    SEVERE: null
    javax.naming.NamingException: Lookup failed for 'ejb.PiecesFacadeLocal' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NameNotFoundException: ejb.PiecesFacadeLocal not found]
        at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:491)
        at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:438)
        at javax.naming.InitialContext.lookup(InitialContext.java:411)
        at test.test2.main(test2.java:57)
    Caused by: javax.naming.NameNotFoundException: ejb.PiecesFacadeLocal not found
        at com.sun.enterprise.naming.impl.TransientContext.doLookup(TransientContext.java:237)
        at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:204)
        at com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:66)
        at com.sun.enterprise.naming.impl.RemoteSerialContextProviderImpl.lookup(RemoteSerialContextProviderImpl.java:109)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie.dispatchToMethod(ReflectiveTie.java:143)
        at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:173)
        at com.sun.corba.ee.impl.protocol.ServerRequestDispatcherImpl.dispatchToServant(ServerRequestDispatcherImpl.java:528)
        at com.sun.corba.ee.impl.protocol.ServerRequestDispatcherImpl.dispatch(ServerRequestDispatcherImpl.java:199)
        at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequestRequest(MessageMediatorImpl.java:1549)
        at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequest(MessageMediatorImpl.java:1425)
        at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleInput(MessageMediatorImpl.java:930)
        at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:213)
        at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequest(MessageMediatorImpl.java:694)
        at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.dispatch(MessageMediatorImpl.java:496)
        at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.doWork(MessageMediatorImpl.java:2222)
        at com.sun.corba.ee.impl.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497)
        at com.sun.corba.ee.impl.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540)
    
    BUILD SUCCESSFUL (total time: 4 seconds)
    Ah et voilà mon jndi.properties
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    java.naming;factory.initial = com.sun.enterprise.naming.SerialInitContextFactory
    java.naming.factory.url.pkgs = com.sun.enterprise.naming
    java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl
    J'ai copié-collé le même que celui du tuto, je ne sais pas trop si c'était la meilleurs chose à faire..

    Bonne journée,

    Marie

  4. #4
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    salut,
    ou est ce que tu as declaré PiecesFacadeLocal?
    Eric

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 33
    Points : 24
    Points
    24
    Par défaut
    Salut,

    Voilà mon arborescence :

    Nom : arbo.PNG
Affichages : 196
Taille : 16,5 Ko

    Et voilà le contenu de mon fichier PiecesFacadeLocal.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Local
    public interface PiecesFacadeLocal {
     
        void create(Pieces pieces);
        void edit(Pieces pieces);
        void remove(Pieces pieces);
        Pieces find(Object id);
        List<Pieces> findAll();
        List<Pieces> findRange(int[] range);
        int count();  
    }
    PiecesFacade.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    @Stateless
    public class PiecesFacade extends AbstractFacade<Pieces> implements PiecesFacadeLocal, PiecesFacadeRemote {
        @PersistenceContext(unitName = "EJB_Tri_Hors_FluxPU")
        private EntityManager em;
     
        @Override
        protected EntityManager getEntityManager() {
            return em;
        }
     
        public PiecesFacade() {
            super(Pieces.class);
        }
     
    }
    AbstractFacade.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    public abstract class AbstractFacade<T> {
        private Class<T> entityClass;
        protected abstract EntityManager getEntityManager();
     
        public AbstractFacade(Class<T> entityClass) {
            this.entityClass = entityClass;
        }
     
        public void create(T entity) {
            getEntityManager().persist(entity);
        }
     
        public void edit(T entity) {
            getEntityManager().merge(entity);
        }
     
        public void remove(T entity) {
            getEntityManager().remove(getEntityManager().merge(entity));
        }
     
        public T find(Object id) {
            return getEntityManager().find(entityClass, id);
        }
     
        public List<T> findAll() {
            javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
            cq.select(cq.from(entityClass));
            return getEntityManager().createQuery(cq).getResultList();
        }
     
        public List<T> findRange(int[] range) {
            javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
            cq.select(cq.from(entityClass));
            javax.persistence.Query q = getEntityManager().createQuery(cq);
            q.setMaxResults(range[1] - range[0]);
            q.setFirstResult(range[0]);
            return q.getResultList();
        }
     
        public int count() {
            javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
            javax.persistence.criteria.Root<T> rt = cq.from(entityClass);
            cq.select(getEntityManager().getCriteriaBuilder().count(rt));
            javax.persistence.Query q = getEntityManager().createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        }
     
    }
    Et dans mon programme de test, je déclare un objet PiecesFacadeLocal au début :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class test2 {       @EJB     private static PiecesFacadeLocal pf;       public static void main(String[] args) { [...] } }
    Désolée de mettre autant de code mais ça pourra peut-être vous permettre de vérifier/corriger mes annotations.
    Je ne suis pas encore très à l'aise avec tout ça, l'erreur vient forcément de moi.

    Merci pour votre aide,

    Marie

  6. #6
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    salut,
    ajoute comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    @Stateless
    @LocalBean
    public class PiecesFacade extends AbstractFacade<Pieces> implements PiecesFacadeLocal, PiecesFacadeRemote {
    eric

  7. #7
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 33
    Points : 24
    Points
    24
    Par défaut
    Merci pour ta réponse.

    J'ai fait la modif et le message d'erreur est toujours le même.

    Pour info, si ça avait fonctionné pour mes test avec interface locale, est-ce que ça n'aurait pas empêcher le fonctionnement en remote?
    Je te pose la question plutôt par curiosité ; j'essaye de toucher un peu aux 2 mais concrètement je pense utiliser l'interface locale dans le cas de mon appli.

    Merci,

    Marie

  8. #8
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    salut,
    je n´avais pas vu l´implementation:
    modifies comme ceci dans ta classe main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @EJB(beanInterface = PiecesFacadeRemote.class)
    	private static PiecesFacadeLocal pf;
    Eric

  9. #9
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 33
    Points : 24
    Points
    24
    Par défaut
    J'ai toujours la même erreur malgré les modifications.

    Merci quand même d'essayer

  10. #10
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    cela devrait marcher,
    peux-tu nous donner le contenu de la classe main y compris les annotations et import?

    essaies ceci voir?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    @Singleton
    @LocalBean
    @Startup
    public class Main {
     
    	@EJB(beanInterface = EmployeeServiceLocal.class)
    	private EmployeeServiceLocal emp;
     
    	@PostConstruct
    	public void init() {
    		Employee employee = emp.find(2);
    		System.out.println(employee);
     
    	}
    }
    et la tu fais run as --> run on server (Serveur glassfish)
    Eric

  11. #11
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 33
    Points : 24
    Points
    24
    Par défaut
    Merci encore pour ta réponse,

    Je n'ai pas fait tout à fait comme toi, j'ai juste créer un void main classique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    package test;
     
    import ejb.PiecesFacadeLocal;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.ejb.EJB;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import jpa.Pieces;
    import jpa.PiecesPK;
     
    public class test2 {
     
        @EJB(beanInterface = PiecesFacadeLocal.class)
        private static PiecesFacadeLocal pf;
     
        public static void main(String[] args) {
     
            Context initialContext;
            try {
                PiecesPK pk=new PiecesPK("hhmmmmmmmmmh","445");
                Pieces p=new Pieces(pk,"hhmmmf", "jjk", "4555", "hhgf", "478522", "45855", 0);
     
                initialContext = new InitialContext();
                pf = (PiecesFacadeLocal) initialContext.lookup("ejb.PiecesFacadeLocal");
                //pf.create(p);
            } catch (NamingException ex) {
                Logger.getLogger(test2.class.getName()).log(Level.SEVERE, null, ex);
            }
     
        }
    }
    J'ai rajouté comme toi au-dessus de mon public class test2 (jusque là je n'avais aucune anotation) :
    @Singleton
    @LocalBean
    @Startup

    ( Ainsi que les imports adequat, et là je ne pouvais plus déployer le projet... )

    Autre chose bizarre : J'ai seulement run file et non pas run on server ...

    De plus, j'ai beau faire clean and build (= sucessful) et deploy (=successful), pourtant je ne trouve pas mon module EJB dans mon dossier application sur glassfish..
    C'est pas normal. Peut-être que le problème ne vient pas de cette partie là du code finalement...

    EDIT : J'ai redémarré Glassfish et je vois maintenant mon module EJB sur le serveur. Par contre toujours pas de run as server.

  12. #12
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    L'injection de ton EJB dans ta class test ne fonctionnera pas.
    Ce n'est pas un objet qui se trouve sur ton serveur d'application, mais dans sa propre machine virtuelle en local.
    Il faut donc uniquement passer par un lookup.

  13. #13
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    salut tu as oublié quelque chose dans ton test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    @PostConstruct
    	public void init() {
    		Employee employee = emp.find(2);
    		System.out.println(employee);
     
    	}
    car celle ci sera executé lors du deploiement mais avec "run on Server"

    essaies avec cette methode dans ta main() et donnes-nous le resultat:
    Eric

  14. #14
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 33
    Points : 24
    Points
    24
    Par défaut
    Merci à vous 2.

    Voilà le code de ma classe après avoir suivi tes conseils jeffray :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    package test;
     
    import ejb.PiecesFacadeLocal;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.annotation.PostConstruct;
    import javax.ejb.EJB;
    import javax.ejb.LocalBean;
    import javax.ejb.Singleton;
    import javax.ejb.Startup;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import jpa.Pieces;
    import jpa.PiecesPK;
     
    @Singleton
    @LocalBean
    @Startup
    public class test2 {
     
        @EJB(beanInterface = PiecesFacadeLocal.class)
        private static PiecesFacadeLocal pf;
     
        @PostConstruct
        public static void init() {
                System.out.println("ok1");
                PiecesPK pk=new PiecesPK("ttttt","yyy");
                Pieces p = pf.find(pk);
                System.out.println(p);
                System.out.println("ok2");
        }
     
        public static void main(String[] args) {
            init();
       }
     
     
    }
    Est-ce que c'est bien ainsi que tu voyais les choses?
    Lorsque je teste avec un find, j'ai un NullPointerException sur le : Pieces p = pf.find(pk); (mon pk correspond bien sûre à quelque chose qui existe dans ma base cette fois-ci)
    Et lorsque je teste toujours avec le create en reprenant le même code que d'habitude, j'ai la même erreur que jusqu'à présent.

    Et je ne trouve toujours pas d'option "run on server" ... C'est sans doute pas normal?

    ____________

    fr1man, j'ai aussi essayé ta technique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    package test;
     
    import ejb.PiecesFacadeLocal;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.annotation.PostConstruct;
    import javax.ejb.EJB;
    import javax.ejb.LocalBean;
    import javax.ejb.Singleton;
    import javax.ejb.Startup;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import jpa.Pieces;
    import jpa.PiecesPK;
     
    public class test2 {
     
        private static PiecesFacadeLocal pf;
     
        public static void main(String[] args) {
     
            Context initialContext;
            try {            
                initialContext = new InitialContext();
                pf = (PiecesFacadeLocal) initialContext.lookup("ejb.PiecesFacadeLocal");
            } catch (NamingException ex) {
                Logger.getLogger(test2.class.getName()).log(Level.SEVERE, null, ex);
            }
     
       }
     
    }
    Et j'ai toujours l'erreur de départ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    août 01, 2014 12:07:18 PM test.test2 main
    SEVERE: null
    javax.naming.NamingException: Lookup failed for 'ejb.PiecesFacadeLocal' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NameNotFoundException: ejb.PiecesFacadeLocal not found]
        at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:491)
        at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:438)
        at javax.naming.InitialContext.lookup(InitialContext.java:411)
        at test.test2.main(test2.java:75)
    Caused by: javax.naming.NameNotFoundException: ejb.PiecesFacadeLocal not found
    [...]
    Je suis vraiment bloquée, mes connaissances ne sont décidemment pas suffisantes pour trouver la solution...
    En tout cas merci pour votre aide.

  15. #15
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    ejb.PiecesFacadeLocal, correspond bien à la valeur @Stateless(mappedName="ejb.PiecesFacadeLocal") de l'EJB que tu cherches à joindre ?
    Ton erreur porte simplement sur le nom.

  16. #16
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 33
    Points : 24
    Points
    24
    Par défaut
    Wahou ! Je ne savais pas du tout qu'il y avait un lien ! Mais forcément une fois que c'est dit, ça semble évident ! On progresse ! :)

    J'ai mis l'arborescence de mon projet dans mon message #5, peux-tu me donner rapidement la procédure à suivre?
    Sachant que mon @Stateless(mappedName = "ejb.PiecesFacadeLocal") est dans mon fichier DaoJpa.

    Car lorsque je fais simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public class test2 {
        private static DaoJpa test;
    public static void main(String[] args) {
            Context initialContext;
            try {
     
                initialContext = new InitialContext();
                test = (DaoJpa) initialContext.lookup("interface");
     
            } catch (NamingException ex) {
                Logger.getLogger(test2.class.getName()).log(Level.SEVERE, null, ex);
            }
       }
    }
    J'ai toujours :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    août 01, 2014 2:06:35 PM test.test2 main
    SEVERE: null
    javax.naming.NamingException: Lookup failed for 'interface' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NameNotFoundException: interface not found]
        at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:491)
        at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:438)
        at javax.naming.InitialContext.lookup(InitialContext.java:411)
        at test.test2.main(test2.java:78)
    Caused by: javax.naming.NameNotFoundException: interface not found
    Pour info ma classe DaoJpa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    @Stateless(mappedName = "interface")
    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public class DaoJpa implements IdaoLocal/*, IdaoRemote*/ {
        @PersistenceContext
        private EntityManager em;
     
         // liste des pieces
        @Override
        public List<Pieces> getAllPieces() {
            try {
                return em.createQuery("select p from Pieces p").getResultList();
            } catch (Throwable th) {
                throw new Tri_hors_Flux_Exception (th, 1);
            }
        }
     
        // ajouter une piece
        @Override
        public Pieces ajouterPiece(Pieces piece) {
            try {
                em.persist(piece);
                return piece;
            } catch (Throwable th) {
                throw new Tri_hors_Flux_Exception (th, 5);
            }
        }
     
    }
    Merci beaucoup :)

  17. #17
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    si tu as ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    package some.location
     
    @Stateless(mappedName = "interface")
    public class DaoJpa implements IdaoLocal {
    ...
    }
    alors il faudra
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    initialContext = new InitialContext();
                test = (DaoJpa) initialContext.lookup("interface#dao.DaoJpa");

    eric

  18. #18
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Il faut que tu références l'interface remote pour y accéder de ton main.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try {
     
                initialContext = new InitialContext();
                IdaoRemote test = (IdaoRemote) initialContext.lookup("interface");
     
            } catch (NamingException ex) {
                Logger.getLogger(test2.class.getName()).log(Level.SEVERE, null, ex);
            }
    EDIT:
    Essaie sinon de mettre dans ton lookup, le chemin, package + nomInterfaceRemote

    Jette un oeil là:
    http://blog.jelastic.com/2013/10/15/...ssfish-server/

  19. #19
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 33
    Points : 24
    Points
    24
    Par défaut
    Bonjour,

    J'ai bien essayé vos différentes solutions, mais l'erreur de nom est toujours là...

    Je suis en train de chercher pour tous les fichiers par lequel il passe d'où pourrait provenir l'erreur.
    Je m'interroge aussi sur le fichier de départ à cibler dans le lookup.

    Et si c'est normal de ne rien avoir dans mon IdaoLocal.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @Local
    public interface IdaoLocal extends Idao {
     
    }
    J'ai trouvé quelque chose qui me semble bizarre ; voilà mon DaoJpa.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    @Stateless(mappedName = "interface")
    //@TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public class DaoJpa implements IdaoLocal/*, IdaoRemote*/ {
        @PersistenceContext
        private EntityManager em;
     
         // liste des pieces
        @Override
        public List<Pieces> getAllPieces() {
            try {
                return em.createQuery("select p from Pieces p").getResultList();
            } catch (Throwable th) {
                throw new Tri_hors_Flux_Exception (th, 1);
            }
        }
     
        // ajouter une piece
        @Override
        public Pieces ajouterPiece(Pieces piece) {
            try {
                em.persist(piece);
                return piece;
            } catch (Throwable th) {
                throw new Tri_hors_Flux_Exception (th, 5);
            }
        }
     
    }
    Je crois qu'à aucun endroit je ne défini le em Entity Manager.
    Confirmez-vous que c'est anormal? Savez-vous à quel endroit est-ce que je serai censée le faire?

    Est-ce que mon jndi.properties est bon?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    java.naming;factory.initial = com.sun.enterprise.naming.SerialInitContextFactory
    java.naming.factory.url.pkgs = com.sun.enterprise.naming
    java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl
    Je ne sais pas trop à quoi il est censé servir, ni comment mon projet sait qu'il doit l'utiliser.
    Ce fichier doit-il être personnalisé? (je l'ai copié-collé) Et si oui, comment?

    Merci pour votre aide,
    Bonne journée,

    Marie

    NB : Je cherche bien a accéder à mon interface locale et non remote pour l'instant.

    EDIT :

    En fait le em est défini dans mon PiecesFacade.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    @Stateless
    @LocalBean
    public class PiecesFacade extends AbstractFacade<Pieces> implements PiecesFacadeLocal/*, PiecesFacadeRemote*/ {
        @PersistenceContext(unitName = "EJB_Tri_Hors_FluxPU")
        private EntityManager em;
     
        @Override
        protected EntityManager getEntityManager() {
            return em;
        }
     
        public PiecesFacade() {
            super(Pieces.class);
        }
     
    }
    Mais mon DaoJpa est-il capable de faire ce lien tout seul?

  20. #20
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Le terme remote veut dire une autre machine virtuelle pas forcément une autre machine physique.
    Si tu exécutes un main qui tourne dans sa machine virtuelle et que tu souhaites contacter un EJB qui tourne dans sa machine virtuelle (serveur d'application), il te faut passer par l'interface remote, même si les deux sont exécuter sur la même machine physique.

Discussions similaires

  1. Réponses: 0
    Dernier message: 09/06/2010, 10h10
  2. Réponses: 2
    Dernier message: 31/03/2010, 11h31
  3. Réponses: 3
    Dernier message: 25/07/2002, 10h42
  4. [Manip de fichiers] Fonction retournant des infos
    Par sans_atouts dans le forum C
    Réponses: 3
    Dernier message: 24/07/2002, 14h16
  5. [CR] Est il possible de créer des univers avec Seagate Info?
    Par Frank dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 27/06/2002, 15h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo