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

Format d'échange (XML, JSON...) Java Discussion :

java.lang.ArrayIndexOutOfBoundsException sur Transformation XSLT [XSLT]


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 857
    Par défaut java.lang.ArrayIndexOutOfBoundsException sur Transformation XSLT
    Bonjour,

    A l'aide du package "javax.xml.transform" je réalise une transformation XSLT avec le code suivant.

    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
     
          // Charge le XSL
          TransformerFactory tFactory = TransformerFactory.newInstance();
          StreamSource ss = new StreamSource(sFileXSL);
          Transformer transformer = tFactory.newTransformer(ss);
     
          // Type de transformation (XML, HTML, )
          //transformer.setOutputProperty(OutputKeys.METHOD,"xml");
     
          // Passage de paramètres
          transformer.setParameter("champTri",this.getChampTri());
     
     
          StringWriter swOut = new StringWriter();
          transformer.transform(new StreamSource(sFileXML),new StreamResult(swOut));
    Aucun problème avec le serveur d'application IAS, mais sur BEA il me renvoit systématiquement l'erreur suivante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.ArrayIndexOutOfBoundsException: -1
    Quelqu'un aurait-il déjà rencontré ce problème ?

    Merci d'avance.

  2. #2
    Membre chevronné

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2002
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 346
    Par défaut
    Tu as bien préciser quelle TransformerFactory tu utilisait?

    Pour que ton bout de code marche, il faut indiquer à JAVA quelle TransformerFactory utliser par un bout de code, par exemple (si tu utilise Xalan comme API XSL) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Properties props = System.getProperties();
    props.put("javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl");

  3. #3
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 857
    Par défaut
    Citation Envoyé par woodwai
    Tu as bien préciser quelle TransformerFactory tu utilisait?

    Pour que ton bout de code marche, il faut indiquer à JAVA quelle TransformerFactory utliser par un bout de code, par exemple (si tu utilise Xalan comme API XSL) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Properties props = System.getProperties();
    props.put("javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl");
    Non je n'ai rien précisé. Pourtant le code posté plus haut marche en l'état sur IAS.
    Comment puis-je savoir quel TransformerFactory il utilise par défaut ? sachant que quand je trace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    props.get("javax.xml.transform.TransformerFactory")
    il me retourne null...

  4. #4
    Membre chevronné

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2002
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 346
    Par défaut
    Je ne connait pas IAS, mais peut être qu'il utilise lui-même un transformer XSL et que c'est pour cela que ça marche avec lui.

    Dans tout les cas, si tu fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    props.get("javax.xml.transform.TransformerFactory")
    avant d'avoir fait de put dessus, c'est normal que tu n'ai rien ... si tu le fait aprés ... bizzard.

    Effectivement, je pense que par defaut il n'en utilise aucune!

  5. #5
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 857
    Par défaut
    Je vais tester de lui forcer le TransformerFactory pour voir ce que cela donne sur BEA.
    Sinon quels sont les différents TransformerFactory inclus dans le JDK 1.4 ?

  6. #6
    Membre chevronné

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2002
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 346
    Par défaut
    Je vient d'aller jetter un coup d'oeil à ja javadoc de sun, et ce qui est quand même bizzard c'est que si tu ne reseigne rien, une factory par defaut est mise, celle par défaut dans la platform!

    Sinon, tu as celle de sax dans le J2EE 1.4 (pas dans le JDK) :
    javax.xml.transform.sax.SAXTransformerFactory

  7. #7
    Membre confirmé Avatar de fedfil
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 91
    Par défaut
    Salut Sony,

    J'ai rencontré un problème similaire avec Xalan sur un serveur BEA weblogic avec la validation de Schema : Bea a sa propre librairies XALAN et il peut avoir quelques problèmes.

    La seule solution est de forcer l'utilisation de XALAN en ajoutant la librairies Xalan dans ton classpath (avant les librairies weblo)

    Bon courage

  8. #8
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 857
    Par défaut
    Citation Envoyé par fedfil
    Salut Sony,

    J'ai rencontré un problème similaire avec Xalan sur un serveur BEA weblogic avec la validation de Schema : Bea a sa propre librairies XALAN et il peut avoir quelques problèmes.

    La seule solution est de forcer l'utilisation de XALAN en ajoutant la librairies Xalan dans ton classpath (avant les librairies weblo)

    Bon courage
    Et donc tu confirmes comme le dit woodwai qu'il faut que je force le TransformerFactory avec celui de Xalan
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    props.put("javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl");
    Ou il existe une autre implémentation de transformation XSLT avec la librairie Xalan ?

  9. #9
    Membre confirmé Avatar de fedfil
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 91
    Par défaut
    pas exactement : dans le classpath de weblogic, il y a une ancienne librairies de xalan : le nom de la classe est donc le même.

    un premier test qui tu peux réaliser est de tester ta méthode directement avec la méthode main. (sans déployer sur weblogic donc) pour voir si tu as le même comportement.

    sinon, je sais que tu peux afficher les parseurs utilisés par défaut... Mais je n'ai plus la méthode en tête

    J'esseyerai de trouver ça demain.

  10. #10
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 857
    Par défaut
    Alors dans mes tests, voilà où j'en suis en ce moment.

    Sans préciser la TransformerFactory
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TransformerFactory tFactory = TransformerFactory.newInstance();
    il prend celle par défaut du serveur d'application.
    Donc pour :
    - Oracle IAS, la classe propriétaire qu'il instancie est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oracle.xml.jaxp.JXSAXTransformerFactory
    - BEA, la classe qu'il instancie est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    weblogic.xml.jaxp.RegistrySAXTransformerFactory
    Sur un serveur IAS, la transformation se fait sans aucun problème. Pour BEA, toujours cette erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.ArrayIndexOutOfBoundsException : -1
    J'ai également essayé d'instancier une classe de la librairie Xalan
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TransformerFactory tFactory = new org.apache.xalan.processor.TransformerFactoryImpl();
    Et cette fois j'obtiens la même erreur sur les deux serveurs d'application.


    EDIT : Oui et pour afficher les parsers utilisés, j'ai juste affiché la classe utilisée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(""+tFactory.getClass());

  11. #11
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 857
    Par défaut
    J'ai enfin trouvé d'où venait l'erreur !
    Rien à voir avec le TransfomerFactory, l'erreur venait du fichier XSL dont une variable utilisée pour définir un ordre de tri n'était pas pré initialisée, et avait donc chaîne vide comme valeur; ce que la plupart des Transformer n'ont pas l'air d'apprécier hormis celui d'IAS avec lequel je travaillais.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:sort select="*[name()=$champTri]" order="{$sensTri}"/>

  12. #12
    Membre confirmé Avatar de fedfil
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 91
    Par défaut
    cool

    Perso, j'ai retrouvé la méthode pour vérifier son environement xalan. si ça sert pas à toi, ça peut toujours servir à d'autres !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    OutputStream stream = new ByteArrayOutputStream();
    PrintWriter pi = new PrintWriter(stream);
    new EnvironmentCheck().checkEnvironment (pi);
    log.debug("Check Environonment\n"+stream.toString()); //ou System.out.println si vous n'utilisez pas log4j
    pi.close();
    ++

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

Discussions similaires

  1. Erreur java lang.ArrayIndexOutOfBoundsException
    Par lerorodu51 dans le forum NetBeans
    Réponses: 8
    Dernier message: 04/06/2009, 19h17
  2. java.lang.NoClassDefFoundError sur un exemple tout simple
    Par Invité dans le forum Services Web
    Réponses: 2
    Dernier message: 23/02/2009, 10h36
  3. Réponses: 4
    Dernier message: 17/11/2007, 15h29
  4. java.lang.StackOverflowError sur évènement windowDeactivated
    Par SheikYerbouti dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 10/06/2007, 22h23
  5. Réponses: 4
    Dernier message: 30/07/2006, 14h38

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