Ich habe eine Klasse, die xml von einer Drittanbieter-Quelle entfernt (ich habe keine Kontrolle über den Inhalt). Hier ist der Code-Schnipsel, die entpackt:JAXB SAXParseException beim Entpacken von Dokumenten mit relativem Pfad zur DTD
JAXBContext jContext = JAXBContext.newInstance("com.optimumlightpath.it.aspenoss.xsd");
Unmarshaller unmarshaller = jContext.createUnmarshaller() ;
StringReader xmlStr = new StringReader(str.value);
Connections conns = (Connections) unmarshaller.unmarshal(xmlStr);
Connections
eine Klasse erzeugt wird, DTD-> xsd-> Klasse mit xjc. Das Paket com.optimumlightpath.it.aspenoss.xsd
enthält alle diese Klassen.
Das XML, das ich erhalte, enthält einen relativen Pfad im DOCTYPE. Grundsätzlich str.value
oben enthält:
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<!DOCTYPE Connections SYSTEM "./dtd/Connections.dtd">
<Connections>
...
</Connections>
Dies läuft erfolgreich als Java 1.5 Anwendung. Um den obigen Fehler zu vermeiden, musste ich ein ./ddd-Verzeichnis vom Projektstamm erstellen und alle dtd-Dateien einschließen (ich bin mir nicht sicher, warum ich das tun musste, aber wir kommen dazu).
Ich habe seit einem Web-Service auf Tomcat5.5 erstellt, die die oben genannte Klasse verwendet. Ich bekomme [org.xml.sax.SAXParseException: Relative URI "./dtd/Connections.dtd"; can not be resolved without a document URI.]
auf der Unmarshal-Linie. Ich habe versucht, ./dtd in jedem relavant-Ordner (Projektstamm, WebContent, WEB-INF, Tomcat-Arbeitsverzeichnis, usw.) ohne Erfolg zu erstellen.
Frage # 1: Wo kann ich ./dtd finden, so dass die Klasse es finden kann, wenn sie als tomcat webservice ausgeführt wird? Gibt es irgendeine Tomcat- oder Service-Konfiguration, die ich tun muss, um das Verzeichnis zu erkennen?
Frage 2: Warum braucht die Klasse überhaupt die dtd-Datei? Hat es nicht alle Informationen, die es braucht, um in den Annotationen der Klasse dtd-> xsd-> zu entpacken? Ich habe viele Artikel gelesen, in denen ich die Validierung deaktivieren, EntityResource und andere Lösungen einstellen möchte, aber diese Klasse wird nicht immer als Web-Service bereitgestellt und ich möchte nicht zwei Code-Züge haben.
Jorn - ty für Ihre Antwort. Ich versuche Blaises Vorschlag zuerst, da es die geringsten Codeänderungen erfordert. Aber Sie haben beide sehr hilfreiche Antworten gegeben. Gibt es eine Möglichkeit, die ich beiden zuschreiben kann? –
Mein Ansatz wird funktionieren, aber der Vorteil von Jorns Ansatz ist, dass Sie JAXB-Implementierung agnostisch bleiben, die die tragbarste Lösung ist. –