2009-08-10 19 views
14

Ho un'applicazione che è stata eseguita felicemente in Java 1.5 per circa un anno. Abbiamo appena aggiornato le caselle e installato Java 1.6.Il metodo Java funziona in 1.5 ma non 1.6

Dopo aver distribuito l'applicazione sul nuovo server, è stato rilevato che l'applicazione genera un'eccezione quando tenta di trasformare un file XML. Non siamo riusciti a capire perché questo stava accadendo finché non lo abbiamo implementato localmente e lo stesso è successo. Dopo aver cambiato l'SDK in v1.5 il problema si è interrotto e l'applicazione funziona 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; 
    } 

Si infrangono 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.

+4

Sembra che tu abbia un'implementazione di Xerx in conflitto da qualche parte nel tuo percorso di classe. – akarnokd

+1

Quali jar relativi a xml si trovano nel classpath? – Yishai

risposta

18

Non ricordo se era compreso tra 1.4 e 1.5 o 1.5 e 1.6, ma le librerie Xalan fornite con JVM da Sun hanno cambiato il nome del pacchetto. Mi sono imbattuto in qualcosa di simile circa 2 anni fa. Penso che quello che dovevo fare era spedire esplicitamente 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 link text

+7

Si suppone che si debba utilizzare solo l'API JAXP o dipendere dalle stesse librerie xerces, mai dall'implementazione fornita dal sole (che varierà tra le versioni). – wds

+1

Vedo un caso in cui ciò sta accadendo e il codice chiama TransformerFactory per creare un Transformer, quindi transform() sul Transformer e lancia questa eccezione. Questo sembra essere il modo giusto per farlo. Il codice funzionava bene in Java 5 e dopo l'aggiornamento a Java 6 lanciava questa eccezione. Includere la mia copia di xalan ha risolto il problema. –

+0

dove trovo la mia copia di xalan? e come includo e sostituisco cosa è stato fornito da oracle ??? –

3

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

+0

Ho provato ad aggiungere un nuovo Xerces JAR ma questo non ha risolto la risposta in alto, così ho provato il tuo suggerimento e rimosso il JAR di Xerces dal mio percorso di costruzione e ha funzionato, grazie! – Kairan

+0

XALAN arriva in rt.jar Stai dicendo che dovrei rimuovere jar da jre/lib path? –

0

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

7

Questo problema si verifica in JDK 1.6 con un vecchio xerces. jar che, quando su classpath, fornisce il proprio DocumentBuilderFactory.

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

È possibile controllare il proprio WEB-INF/lib o equivalente.

2

Incontro lo stesso java.lang.AbstractMethodError nel mio codice.

Al momento la modifica della versione di qualsiasi libreria non era un'opzione, ma ho trovato una soluzione confrontando con un altro codice che funzionava misteriosamente. Forse questo potrebbe aiutare gli altri là fuori.

Tutto ciò ha a che fare con il documento passato a DOMSource(). Originariamente 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; 
} 

Per risolvere questo problema, ho cambiare la linea di fabbrica come segue:

 DocumentBuilderFactory factory = new DocumentBuilderFactoryImpl(); 

Ora ho più l'eccezione .

+0

Ottimo! non avere a che fare con il conflitto jar. Grazie. –

0

Ho avuto lo stesso problema & sostituito xercesImpl-2.0.2.file jar con xercesImpl-2.11.0.jar nel percorso di classe della mia applicazione. Funziona bene.

0

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);