Domanda

Ho una domanda che è stata felicemente in esecuzione sotto Java 1.5 per circa un anno. Abbiamo appena avuto le scatole aggiornati e aveva Java 1.6 installato.

Dopo la distribuzione l'applicazione per il nuovo server che abbiamo trovato l'applicazione è un'eccezione quando si cerca di trasformare un po 'di XML. Non siamo riusciti a capire perché questo stava accadendo fino a quando abbiamo implementato a livello locale e lo stesso è accaduto. Dopo aver cambiato l'SDK per V1.5 il problema si fermò e l'applicazione viene eseguita correttamente.

Ecco sorgente del metodo:

import java.io.StringWriter;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Element;
import org.w3c.dom.Node;


   public static String xmlToString(Node node) {
    try {
        Source source = new DOMSource(node);
        StringWriter stringWriter = new StringWriter();
        Result result = new StreamResult(stringWriter);
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer();
        transformer.transform(source, result);
        return stringWriter.getBuffer().toString();
    } catch (TransformerConfigurationException e) {
        e.printStackTrace();
    } catch (TransformerException e) {
        e.printStackTrace();
    }
    return null;
   }

E 'schiantarsi sulla "transformer.transform (fonte, risultato);" linea con eccezione:

Exception in thread "main" java.lang.AbstractMethodError: org.apache.xerces.dom.DocumentImpl.getXmlStandalone()Z
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.setDocumentInfo(DOM2TO.java:373)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:127)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:94)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:662)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:708)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:313)

Qualcuno sa di eventuali modifiche apportate a Java tra le due versioni che causare questo? Quale sarebbe la soluzione più semplice?

Grazie per il vostro aiuto.

È stato utile?

Soluzione

Non mi ricordo se era tra 1,4 e 1.5 o 1.5 e 1.6, ma le librerie Xalan forniti con la JVM da parte di Sun ha cambiato il loro nome del pacchetto. Mi sono imbattuto in qualcosa di simile circa 2 anni fa. Penso che quello che ho dovuto fare è stato spedito in modo esplicito la mia implementazione Xalan per risolvere il problema.

UPDATE: Questo potrebbe essere stato quello che stavo pensando di, anche se ancora potrebbe essere correlato al tuo problema text link

Altri suggerimenti

Questo problema si verifica in JDK 1.6 con xerces.jar antica che, quando il percorso di classe, fornisce il proprio DocumentBuilderFactory.

Il problema non si verifica quando si utilizza la piattaforma predefinita in fabbrica.

Si consiglia di controllare la WEB-INF / lib o equivalente.

E 'il problema a causa del vaso (Xalan) conflitto di versione. Togliere i vasetti e dare una prova

ho incontrato questo stesso java.lang.AbstractMethodError nel mio codice.

Al momento cambiare la versione di tutte le librerie non era un'opzione, ma ho trovato una soluzione attraverso il confronto con altri codici che misteriosamente ha funzionato. Forse questo potrebbe aiuta gli altri là fuori.

Tutto ha avuto a che fare con il documento che ho passato in DOMSource (). Messaggio che avevo creato un documento nel modo standard:

    private static Document documentFromInputStream(InputStream in) throws ParserConfigurationException, SAXException, IOException {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.parse(new InputSource(in));
    return doc;
}

ovviare a questo problema , posso cambiare la linea di fabbrica come segue:

        DocumentBuilderFactory factory = new DocumentBuilderFactoryImpl();

Ora ho più l'eccezione.

Si consiglia di utilizzare la versione più recente da Xerces (credo che dovrebbe essere compitable con JDK1.6)

Ho avuto lo stesso problema e sostituito il file xercesImpl-2.0.2.jar con xercesImpl-2.11.0.jar nel percorso della classe della mia applicazione. Il suo funzionamento benissimo.

Questo ha funzionato per me.

 TransformerFactory factory = TransformerFactory.newInstance();
    Transformer transformer = factory.newTransformer();
            transformer.setOutputProperty(OutputKeys.METHOD, "xml");
    DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(sWout);
            transformer.transform(source, result);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top