c300: / XML-Transformation: NullPointerExceptions

Guten Abend

Ich versuche eine XML-Transformation mittels XSL serverseitig (in Java) hinzukriegen. Dazu verwende ich den Xalan PRozessor.

Ich habe ein valides XML, sowie zwei valide XSL-Templates. die Transformation funktioniert mit keinem der beiden Templates. Ich erhalte eine NullPointerException... Der Javacode ist laut IDE fehlerfrei und lässt sich auch ohne Warnungen kompilieren.

Java-Code:

...
TransformerFactory fact = Transformerfactory.newInstance();
Transformer t = factory.newTransformer(xslStreamSource);
t.transform(xmlDOMSource,xmlStreamResult);
...

Es wird wie gesagt eine NullPointerException geworfen. deren Trace beginnt mit java.lang.NullPointerException at org.apache.dtm.ref.dom2dtm.DOM2DTM.addNode(DOM2DTM.java:246) at
...

Meine erste eigene Klasse folgt an /. Stelle im Trace. Es handelt sich um die Zeile 't.transform...'

Kennt jemand solche Probleme und könnte mir Hinweise zu deren Lösung geben? Wär super, danke.

Gruss
c300

  1. Hallo,

    org.apache.dtm.ref.dom2dtm.DOM2DTM.addNode(DOM2DTM.java:246) at

    ^^
    Fehlt da nicht ein ".xml"? Bei mir heißt das Package org.apache.xml.dtm.ref.dom2dtm.

    Durch eine einfach Google-Suche nach genau diesem Stacktrace-Entry
    habe ich folgende Seite gefunden: http://issues.apache.org/jira/browse/XALANJ-1575

    Wenn ich http://issues.apache.org/jira/browse/XALANJ-1575#action_50121 richtig
    deute, liegt der Fehler bei dir.

    Ich hoffe, das hilft dir schon.

    Meine erste eigene Klasse folgt an /. Stelle im Trace. Es handelt sich um die Zeile 't.transform...'

    Nächstes mal bitte den ganzen Stacktrace. Mindestens aber die ersten 10-15 Zeilen.

    Gruß
    Slyh

    1. Hallo

      Danke, das bringt mich mal bisschen weiter. Sorry wegen dem unvollständigen Trace, hätte alles abtippen müssen, meine infrastruktur ist ferienhalber nicht grad berauschend.

      Gruss

      1. Hallo,

        Sorry wegen dem unvollständigen Trace, hätte alles abtippen müssen,

        Huh? Welche Werkzeuge verwendest du, die kein Copy&Paste erlauben?
        Immerhin kann man seit mind. Windows 95 in der Konsole die Ausgabe
        markieren und kopieren. Linux sollte damit auch keine Problem habe.
        Was also hast du da an Software?

        Gruß
        Slyh

      2. Hallo

        »»Sorry wegen dem unvollständigen Trace, hätte alles abtippen müssen, meine infrastruktur ist ferienhalber nicht grad berauschend.

        ^^
        unverständlich!!

        HI

        ich muss sagen das beeindruckt mich! Keine Copy&Paste naja ich weiß ja net was du für ein System hast aber das ist glaube ich seiner Zeit weit zurück, vielleicht windows3.1 oder sowas ich glaube auf meinem 386 ging diese Funktion noch nicht!!!

        Naja wenn du mir dein Betriebssystem nennst, kann ich es ja testen

        Mfg chriss

        1. Hallo

          Ich versuchs Dir verständlich zu machen:
          1 Notebook mit XP, gehört der Firma, lässt nur DSL-Internetzugang zu, auf dem läuft die ganze IDE etc. Das Einstöpseln eines USB-Memorysticks bewirkt einen sofortigen Bluescreen (was relativ nervig ist). Ein Floppy gibts da nicht.

          2. Notebook, privat, Internetzugang via ISDN und DSL. Kein Floppy. USB-Stick würde funktionieren.

          Location: kein DSL möglich.

          Ich hoffe, das erklärt die unmöglichkeit von CopyPaste.

          Gruss.

  2. Hallo,

    ...
    TransformerFactory fact = Transformerfactory.newInstance();
    Transformer t = factory.newTransformer(xslStreamSource);

    ^woher kommt factory?

    t.transform(xmlDOMSource,xmlStreamResult);
    ...
    Es wird wie gesagt eine NullPointerException geworfen.
    Meine erste eigene Klasse folgt an /. Stelle im Trace. Es handelt sich um die Zeile 't.transform...'

    Es sieht so aus, als wäre xmlDOMSource oder xmlStreamResult NULL. Das lässt sich herausbekomen, indem Du xmlDOMSource.toString() und xmlStreamResult.toString() testweise ausgeben lässt, bevor Du sie in der Methode Transformer.transform(Source xmlSource, Result outputTarget) verwendest.

    viele Grüße

    Axel

    1. Hallo Axel,

      Es sieht so aus, als wäre xmlDOMSource oder xmlStreamResult NULL. Das lässt sich herausbekomen, indem Du xmlDOMSource.toString() und xmlStreamResult.toString() testweise ausgeben lässt, bevor Du sie in der Methode Transformer.transform(Source xmlSource, Result outputTarget) verwendest.

      dann hast du aber wieder eine NullPointerException, denn wenn das Objekt null ist, kannst du keine der Methoden aufrufen.

      Gruß,
      Martin

      1. Hallo,

        Es sieht so aus, als wäre xmlDOMSource oder xmlStreamResult NULL. Das lässt sich herausbekomen, indem Du xmlDOMSource.toString() und xmlStreamResult.toString() testweise ausgeben lässt, bevor Du sie in der Methode Transformer.transform(Source xmlSource, Result outputTarget) verwendest.

        dann hast du aber wieder eine NullPointerException, denn wenn das Objekt null ist, kannst du keine der Methoden aufrufen.

        Ja, aber mit einem kürzeren und eindeutigeren trace ;-)).

        Aber Du hast natürlich Recht. Ich wollte ihm nur nicht
        System.out.println(xmlDOMSource) und System.out.println(xmlStreamResult) vorschlagen, weil ich nicht wusste, ob er den System-Out-Stream sieht. Mir war in Erinnerung, dass System.out.println(Object o) jeweils die Methode o.toString() nutzt. Das ist falsch. Besser wäre String.valueOf(xmlDOMSource) und String.valueOf(xmlStreamResult).

        viele Grüße

        Axel

        1. Hallo Axel,

          Mir war in Erinnerung, dass System.out.println(Object o) jeweils die Methode o.toString() nutzt. Das ist falsch. Besser wäre String.valueOf(xmlDOMSource) und String.valueOf(xmlStreamResult).

          da gibt's noch ne bessere Möglichkeit: log4j. Dem Logging-Framework kannst du auch Objekte vorwerfen, die null sind, das gibt dann "null" aus. Nicht nur auf der Konsole, sondern auch in Dateien oder sonstwohin. Alle frei konfigurierbar.

          Gruß,
          Martin

          1. Hallo

            Danke für Eure Hinweise, also, weder Template, noch die Source oder das Result für den Transformer.transform() sind null. Weiter bin ich auch den Hinweisen aus dem Link von Slyh, betreffend Namespaces  nachgegangen. Auch hier leider erfolglos. Die Exception bringe ich nicht weg.

            Anbei der Trace ein bisschen umfangreicher:

            java.lang.NullPointerException at org.apache.xml.dtm.ref.dom2dtm.DOM2DTM.addNode(DOM2DTM.java:246) at org.apache.xml.dtm.ref.dom2dtm.DOM2DTM.addNode(DOM2DTM.java:162) at org.apache.xml.dtm.ref.DTMManagerDefault.getDTM(DTMManagerDefault.java:291 at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:658) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1129) at
            org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1107) at XMLTransformer.transformXML(XMLTransformer.java:34) at XMLSeminarServlet.doGet(XMLSeminarServlet.java:74) at javax.servlet.http.HttpServlet.service(HttpServlet.java:740) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)

            undsoweiter...

            Hoffe, Ihr habt noch weitere Hinweise.

            Danke und Grüsse
            c300

            1. Hallo,

              Anbei der Trace ein bisschen umfangreicher:

              java.lang.NullPointerException at org.apache.xml.dtm.ref.dom2dtm.DOM2DTM.addNode(DOM2DTM.java:246) at org.apache.xml.dtm.ref.dom2dtm.DOM2DTM.addNode(DOM2DTM.java:162)

              Leider ist org.apache.xml.dtm.ref.dom2dtm.DOM2DTM.addNode() offensichtlich nicht protected  bzw. public und damit auch nicht dokumentiert http://xml.apache.org/xalan-j/apidocs/org/apache/xml/dtm/ref/dom2dtm/DOM2DTM.html. Man kann hier also nichts erkennen, es sei denn man hätte die Source von DOM2DTM.java. Es könnte etwas mit http://xml.apache.org/xalan-j/apidocs/org/apache/xml/dtm/DTM.html#appendChild(int, boolean, boolean) zu tun haben. Dann würde entweder newChild oder str, je nach Methode appendChild() oder appendTextChild(), NULL sein.

              at org.apache.xml.dtm.ref.DTMManagerDefault.getDTM(DTMManagerDefault.java:291)

              Die DTM sollte da sein, denn beide getDTM()-Methoden liefern _nicht_ NULL. http://xml.apache.org/xalan-j/apidocs/org/apache/xml/dtm/ref/DTMManagerDefault.html#getDTM(int)

              Wenn man sich die wahrscheinliche Funktion von addNode() vorstellt, könnte es sein, dass zwar DTM und Source vorhanden sind, aber irgendwas aus der Source sich nicht als DTM-Node-handle bzw. String übergeben lässt.

              viele Grüße

              Axel