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 :

[JAXB] Problème pour unmarshaller avec une interface


Sujet :

Persistance des données Java

  1. #1
    Membre actif
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Points : 234
    Points
    234
    Par défaut [JAXB] Problème pour unmarshaller avec une interface
    Bonjour,

    J'ai un xml schéma XSD qui me permet de générer mes classes java avec XJC. Pour ça pas de souci.
    J'ai créé une classe qui hérite d'une classe créée par XJC dans laquelle j'ai rajouté des primitives et des méthodes pour le fonctionnement de mon algo. Pas de souci, tout fonctionne bien.
    Mais j'ai un souci dès que j'ajoute dans ma classe fille une primitive de type Iterator.
    J'ai le message d'erreur "JAXB can't handle interfaces" à l'écécution.
    J'ai recherché une solution et j'ai trouvé beaucoup de sites qui parlent de ce pb mais j'avoue que mon anglais est limité et les choses ne sont pas claires pour moi.

    Voici un extrait de mon code pour clarifier ceci (je mets le stricte nécessaire):
    Voici la classe générée par XJC depuis mon XSD :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class OperatingWithRelativeTimeRate
        implements Serializable
    {
     
        private final static long serialVersionUID = 1L;
        @XmlElement(name = "RelativeTimeRate")
        protected List<RelativeTimeRate> relativeTimeRate;
    }
    J'ai donc une collection List. Cette classe est générée et je ne veux pas y toucher.

    Voici la classe que j'ai écrite moi et qui hérite de la première :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class OperatingWithRelativeTimeRateExtension
    	extends OperatingWithRelativeTimeRate
    	implements Serializable
    {
    	(...)
    	private Iterator<RelativeTimeRate> _iterOnOperatingTable;
    }
    Pour mon algo, j'ai besoin de garder un itérateur sur ma liste pour optimiser le parcours.
    Tout fonctionne très bien sans cet itérateur. Mais dès que je le mets j'ai l'erreur Can't handle Interface à l'éxécution.

    J'ai cherché le moyen de spécifier dans la classe fille de ne pas prendre en compte la primitive Iterator. Mais j'ai pas trouvé.

    Peut être aussi qu'il y aurait une autre solution pour conserver l'info position dans ma liste, mais je ne vois pas.

    Je précise que je suis dans une phase d'optimisation. J'ai profiler mon appli et 90% du temps proc est passé dans le parcours de cette liste. Pour un teste simple, le calcul prend plus de 6H30. Donc l'optimisation est énorme.

    Voici en bref l'objet de mon appli pour mieux comprendre :
    Mon appli fait de la simultation en mécanique des fluides.
    Les données d'entrées permettant de faire une simulation sont écrites par l'utilisateur au format XML en respectant le XSD évoqué.
    Le problème se pose à l'écécution lors du unmarshaller du fichier source des données d'entrées.
    Mon algo fait plusieurs milliers d'itérations afin d'arriver à une solution.
    Dans cet algo j'ai besoin d'aller chercher une info dans la liste. A chaque itération je parcours donc ma liste depuis le début. Hors cette liste est ordonnée et à chaque incrément je veux avoir l'info se trouvant après.
    Donc je cherche absolument le moyen d'éviter ce parcours en stockant la position dans la liste pour accéder immédiatement à l'élément suivant.

    Tous les sites que j'ai pu trouver ne répondent pas exactement à mon pb puisqu'ils évoquent tous l'opération inverse : le marshalling pour généré un XML depuis le code JAVA.

    Est ce que quelqu'un pourait m'aider ou m'aiguiller pour trouver une solution SVP.
    Merci d'avance.
    Cdlt.

  2. #2
    Membre émérite
    Avatar de olivier.pitton
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2012
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 355
    Points : 2 814
    Points
    2 814
    Par défaut
    Si tu veux te passer de l'itérateur, tu dois le rendre non persistant.

    Pour cela ajoute simplement le mot-clé transient à ta variable. Ce mot-clé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private transient Iterator<RelativeTimeRate> _iterOnOperatingTable;

  3. #3
    Membre actif
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Points : 234
    Points
    234
    Par défaut
    Ca marche !!!

    Je n'en reviens pas. Je n'y étais pas du tout sur ce coup là. Je cherchais une solution par rapport au mapping XML et non pas à la sérialisation puisque l'erreur se produisait sur un unmarshaller.

    Mille mercis Olivier.

    J'abuserais en demandant comment tu as trouvé ça et surtout m'expliqer où est le lien entre la sérialisation et le mapping xml.


    Encore merci en tout cas.

  4. #4
    Membre émérite
    Avatar de olivier.pitton
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2012
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 355
    Points : 2 814
    Points
    2 814
    Par défaut
    Plop,

    JAXB utilise la sérialisation pour les classes. Or le mot-clé standard de Java transient permet de ne pas sérialiser les champs marqués. Ces-derniers sont simplement ignorés durant le processus, et mis à null lors de la désérialisation.

    Beaucoup d'outils se basant sur la sérialisation utilisent ce genre de "mécanismes", par exemple JPA utilise l'annotation @Transient.

    Un cours sur la sérialisation dans le cours Java jmdoudou chap sérialisation.

  5. #5
    Membre actif
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Points : 234
    Points
    234
    Par défaut
    OK. Merci pour ces explications. Je connais bien la sérialisation et le mot clé Transcient. Mais je connais beaucoup moins bien JAXB et je n'avais pas pensé à ça du tout.
    Encore merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. MVVM - Problème pour Autoscroll sur une ListBox avec du databinding
    Par caramel dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 18/11/2011, 14h29
  2. Problème pour requeter avec une relation manyToMany
    Par fab76000 dans le forum Hibernate
    Réponses: 0
    Dernier message: 26/04/2011, 17h32
  3. Probléme avec une interface graphique.
    Par farouk2506 dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 11/10/2010, 13h10
  4. Problème de ports utilisés pour communiquer avec une BDD Oracle.
    Par KuBi4K dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 13/09/2010, 12h13
  5. Réponses: 3
    Dernier message: 08/04/2010, 11h29

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