J'ai une classe qui diffuse xml à partir d'une source tierce (je n'ai aucun contrôle sur le contenu). Voici l'extrait qui unmarshals:JAXB SAXParseException lors de la résolution d'un document avec un chemin d'accès relatif à la 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
est une classe générée DTD> xsd-> classe à l'aide xjc. Le paquet com.optimumlightpath.it.aspenoss.xsd
contient toutes ces classes.
Le fichier xml I reçoit contient un chemin relatif dans DOCTYPE. En fait str.value
ci-dessus contient:
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<!DOCTYPE Connections SYSTEM "./dtd/Connections.dtd">
<Connections>
...
</Connections>
Cela va avec succès comme une application java 1.5. Afin d'éviter l'erreur ci-dessus, j'ai dû créer un répertoire ./dtd à partir de la racine du projet et inclure tous les fichiers dtd (je ne sais pas pourquoi je devais le faire mais nous y arriverons).
J'ai depuis créé un service web sur Tomcat5.5 qui utilise la classe ci-dessus. Je reçois [org.xml.sax.SAXParseException: Relative URI "./dtd/Connections.dtd"; can not be resolved without a document URI.]
sur la ligne unmarshal. J'ai essayé de créer ./dtd dans chaque dossier relavant (racine du projet, WebContent, WEB-INF, répertoire de travail tomcat, etc) en vain. Question n ° 1: Où puis-je trouver ./dtd afin que la classe puisse le trouver lorsqu'il est exécuté en tant que service web Tomcat? Existe-t-il une configuration de tomcat ou de service que je dois faire pour que le répertoire soit reconnu? Question n ° 2: Pourquoi la classe a-t-elle besoin du fichier dtd en premier lieu? N'a-t-il pas toutes les informations dont il a besoin pour se marier dans les annotations de la classe dtd-> xsd->? J'ai lu de nombreux articles sur la désactivation de la validation, la définition de EntityResource et d'autres solutions, mais cette classe n'est pas toujours déployée en tant que service Web et je ne souhaite pas avoir deux trains de code.
Jorn - ty pour votre réponse. J'essaie d'abord la suggestion de Blaise car elle nécessite le moins de changements de code. Mais vous avez tous les deux fourni des réponses très utiles. Y a-t-il un moyen de créditer les deux? –
Mon approche fonctionnera, mais l'avantage de l'approche de Jorn est que vous restez agnostique JAXB qui est la solution la plus portable. –