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

Java EE Discussion :

Problème d'utilisation distante d'EJB faisant appel à des Entity contenant des collections


Sujet :

Java EE

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 40
    Points : 16
    Points
    16
    Par défaut Problème d'utilisation distante d'EJB faisant appel à des Entity contenant des collections
    Bonjour à tous,

    Je rencontre un problème jusqu'ici insolvable et j'aurais bien besoin d'un petit coup de pouce !

    J'ai mis en place des Entity Beans qui mappent ma base de données (Toplink & SQL SERVER). Ils sont donc liés entre eux et notamment par des List pour les relations onetomany et manytomany.

    J'ai ensuite mis en place mes EJB3. J'utilise les interface @local coté Web et tout fonctionne.

    Me voilà donc partie coté Swing où je comptais utiliser mes interfaces @remote. Et là, catastrophe: les EJB faisant appel à des Entity liés à d'autres via mes List sont inutilisables.

    Je rencontre l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    26 janv. 2010 09:20:00 com.sun.corba.ee.impl.encoding.CDRInputStream_1_0 readRMIIIOPValueType
    ATTENTION: "IOP00810211: (MARSHAL) Exception from readValue on ValueHandler in CDRInputStream"
    org.omg.CORBA.MARSHAL:   vmcid: SUN  minor code: 211 completed: Maybe
     
    ...
     
    Caused by: java.io.IOException: Mismatched serialization UIDs : Source (Rep. IDRMI:oracle.toplink.essentials.indirection.IndirectList:C736541957C385C5:7070E88CAC21B40B) = 7070E88CAC21B40B whereas Target (Rep. ID RMI:oracle.toplink.essentials.indirection.IndirectList:C736541957C385C5:8CE233D0CA77EED4) = 8CE233D0CA77EED4
            at com.sun.corba.ee.impl.util.RepositoryId.useFullValueDescription(RepositoryId.java:650)
            at com.sun.corba.ee.impl.io.ValueHandlerImpl.useFullValueDescription(ValueHandlerImpl.java:420)
            at com.sun.corba.ee.impl.io.IIOPInputStream.simpleReadObject(IIOPInputStream.java:419)
    Il s'agirait donc d'un problème de sérialisation ...

    J'ai effectué plusieurs tests :
    - utiliser mes interfaces @remote en local (tout fonctionne).
    - utiliser des Collection à la place des List.
    - passer en EAGER plutôt qu'en LAZY.

    J'ai parcouru plusieurs forums sur lesquels j'ai pu lire qu'il pouvait s'agir d'une différence de versions entre les deux JVM, ce qui n'est pas mon cas.

    Rien n'y fait...

    Un peu d'aide pour une débutante ?!

    Merci d'avance!

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Peux-tu montrer le mapping de ton Entity "maître" ?
    Je suppose que tes listes font référence à un proxy (qui ne doit pas être serializable)

    Autre point, pour une utilisation des entity liés, il faut qu'ils soient chargés avant de rendre la main à l'application appelante. Hors du conteneur d'EJB, le lazy loading n'est plus possible (session fermée)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    Mon entity "maître" ? C'est à dire ?

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    celui qui encapsule les listes

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    J'en ai plusieurs, tous codés de la même manière, donc en voici un exemple:

    Auteur.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
    50
     
    @Entity
    @Table(name = "AUTEUR")
    @NamedQueries({@NamedQuery(name = "Auteur.findAll", query = "SELECT a FROM Auteur a"), @NamedQuery(name = "Auteur.findById", query = "SELECT a FROM Auteur a WHERE a.id = :id"), @NamedQuery(name = "Auteur.findByNom", query = "SELECT a FROM Auteur a WHERE a.nom = :nom"), @NamedQuery(name = "Auteur.findByPrenom", query = "SELECT a FROM Auteur a WHERE a.prenom = :prenom"), @NamedQuery(name = "Auteur.findByNationalite", query = "SELECT a FROM Auteur a WHERE a.nationalite = :nationalite"), @NamedQuery(name = "Auteur.findByPresentation", query = "SELECT a FROM Auteur a WHERE a.presentation = :presentation")})
    public class Auteur implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        @Basic(optional = false)
        @Column(name = "id")
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private Long id;
        @Basic(optional = false)
        @Column(name = "nom", nullable = false)
        private String nom;
        @Basic(optional = false)
        @Column(name = "prenom", nullable = false)
        private String prenom;
        @Basic(optional = false)
        @Column(name = "nationalite", nullable = false)
        private String nationalite;
        @Basic(optional = false)
        @Column(name = "presentation", nullable = false)
        private String presentation;
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "idAuteur", fetch = FetchType.EAGER)
        @OrderBy("titre ASC")
        private List<Ouvrage> ouvrageList;
        @PrePersist
        @PreUpdate
        private void validerDonnees()
        {
            if ( nom == null || "".equals(nom) )
                throw new ValidationException("Nom invalide");
            if ( prenom == null || "".equals(prenom) )
                throw new ValidationException("Prenom invalide");
            if( nationalite == null || "".equals(nationalite) )
                throw new ValidationException("Nationalité invalide");
            if( presentation == null || "".equals(presentation) )
                throw new ValidationException("Presentation invalide");
        }
     
        public Auteur() {
        }
     
        public Auteur(Long id) {
            this.id = id;
        }
     
      (+ constructeurs, getters, setters, equals() et toString() )
     
    }
    L'Entity Ouvrage est du même type et emploie lui aussi d'autres Entity...

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Tu utilises ceci dans toutes tes classes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    
    private static final long serialVersionUID = 1L;

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    Effectivement.
    A tester en public ?
    Je m'y mets...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    Négatif !

  9. #9
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Non, le problème ne viendrait pas de private / public mais plutôt d'un serialVersionUID oublié ce qui engendrerait une affectation à la compilation et donc une possibilité d'avoir une différence entre le client et le serveur...

    Comment as-tu fait d'ailleurs pour les classes partagées, tu les as mises dans un jar à part ?

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    Non, pas d'oubli...
    Pour les classes partagées, si j'ai bien compris ta question, elles sont dans un jar attaché à mon application cliente.

    Peut-être que cela peut servir : avant d'utiliser la librairie TopLink Essentials, j'obtenais l'erreur suivante:

    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
     
    ATTENTION: "IOP00810257: (MARSHAL) Could not load class oracle.toplink.essentials.indirection.IndirectList"
    org.omg.CORBA.MARSHAL:   vmcid: SUN  minor code: 257 completed: Maybe
            at com.sun.corba.ee.impl.logging.ORBUtilSystemException.couldNotFindClass(ORBUtilSystemException.java:9679)
            at com.sun.corba.ee.impl.logging.ORBUtilSystemException.couldNotFindClass(ORBUtilSystemException.java:9694)
            at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1042)
            at com.sun.corba.ee.impl.encoding.CDRInputStream.read_value(CDRInputStream.java:475)
            at com.sun.corba.ee.impl.io.IIOPInputStream.inputObjectField(IIOPInputStream.java:1983)
     
    ...
     
    Exception in thread "main" javax.ejb.EJBException: nested exception is: java.rmi.MarshalException: CORBA MARSHAL 1398079745 Maybe; nested exception is: 
            org.omg.CORBA.MARSHAL:   vmcid: SUN  minor code: 257 completed: Maybe
    java.rmi.MarshalException: CORBA MARSHAL 1398079745 Maybe; nested exception is: 
            org.omg.CORBA.MARSHAL:   vmcid: SUN  minor code: 257 completed: Maybe
            at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.mapSystemException(Util.java:279)
            at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:205)
            at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
            at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
    En tout cas, un merci pour les pistes ..!

  11. #11
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Il semblerait effectivement que le problème vienne de TopLink, je trouve pas mal de cas similaire sur le net...
    Hélas pour toi, je n'utilise pas TopLink mais Hibernate et je ne connais pas ces problèmes (vive Hibernate ! )

    Je sèche...

    Tu pourrais peut-être te tourner vers le concept de Facade, ça me semble bien adapté à ton problème...
    Tu centralises toutes les méthodes dont tu as besoin dans un EJB session (stateless) et de là, tu utilises les EJB Local.
    D'un point de vue performance ce sera nettement mieux...

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    Merci quand même ..!

  13. #13
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Je remets ceci, j'avais modifié le post pendant ta réponse...

    Tu pourrais peut-être te tourner vers le concept de Facade, ça me semble bien adapté à ton problème...
    Tu centralises toutes les méthodes dont tu as besoin dans un EJB session (stateless) et de là, tu utilises les EJB Local.
    D'un point de vue performance ce sera nettement mieux...

  14. #14
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    J'ai trouvé un autre truc, il faudrait mettre le jar de Toplink côté client également...
    Peux-tu tester ?

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    mettre à jour ?
    Oui, si je l'ai fait correctement, je l'ai fait et pas mal de fois... en le supprimant puis en le rattachant.
    J'ai vu sur certains forums qu'il faudrait utiliser le .ear (comprenant le war et le jar) plutôt que le jar seul... mais je ne vois pas trop pourquoi.

  16. #16
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Ce que je suggérais c'était d'inclure (si ce n'est déjà fait) le jar de TopLink dans ton client (Swing je suppose)

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/02/2013, 11h34
  2. Réponses: 1
    Dernier message: 29/12/2010, 14h50
  3. Réponses: 2
    Dernier message: 27/10/2009, 11h36
  4. Réponses: 3
    Dernier message: 10/12/2005, 20h56
  5. Réponses: 6
    Dernier message: 11/06/2005, 00h56

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