Je deviens très étrange "Fin de dossier prématurée." exception pour les derniers jours sur l'un de nos serveurs. Le XML de configuration identique fonctionne correctement sur un autre serveur. Nous utilisons Tomcat 5.0.28 sur ces deux serveurs. Ce code fonctionne depuis des lustres (plus de 7 ans), et seulement après le crash d’un serveur, nous avons rencontré ce problème sur l’un des serveurs. Il n'y a pas de changement dans XML ainsi que Java. :(
La seule différence que je peux voir est dans Java versions -
Serveur à problème Java version "1.6.0_16" Environnement d'exécution Java SE (version 1.6.0_16-b01) Java HotSpot (TM) Serveur 64 bits VM (version 14.2-b01, mode mixte)
Serveur de travail Java version "1.6.0_07" Environnement d'exécution Java SE (version 1.6.0_07-b06) Java HotSpot (TM) Serveur 64 bits VM (version 10.0-b23, mode mixte)
Voici le code Java qui fonctionne depuis plusieurs années -
private void readSource(final InputSource in ) {
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(in);
Element elt = doc.getDocumentElement();
this.readElement( elt );
} catch ( Exception ex ) {
ex.printStackTrace();
throw new ConfigurationException( "Unable to parse configuration information", ex );
}
}
Et voici l'exception.
[Fatal Error] :-1:-1: Premature end of file.
org.xml.sax.SAXParseException: Premature end of file.
at org.Apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.Apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at com.circus.core.Configuration.readSource(Configuration.Java:706)
J'ai déjà essayé de valider XML et n'y ai trouvé aucune erreur. Toute idée où puis-je chercher un problème possible?
Tous les pointeurs seraient très appréciés!
TIA, - Manish
Ceci est résolu. Le problème était ailleurs. Un autre code du travail cron tronçonnait XML en fichier de longueur 0. Je me suis occupé de ça.
C'est un problème avec Java InputStream. Lorsque le flux est lu une fois que le compteur de position de décalage de fichier est placé à la fin du fichier. Lors de la lecture suivante en utilisant le même flux, vous obtiendrez ce Il faut donc fermer et rouvrir le flux ou appeler inputStream.reset()
pour remettre le compteur d'offset à sa position initiale.
Cette exception ne se produit que si vous analysez un tableau String/Octet vide.
voici un extrait sur la façon de le reproduire:
String xml = ""; // <-- deliberately an empty string.
ByteArrayInputStream xmlStream = new Java.io.ByteArrayInputStream(xml.getBytes());
Unmarshaller u = JAXBContext.newInstance(...)
u.setSchema(...);
u.unmarshal( xmlStream ); // <-- here it will fail
Assurez-vous de ne pas consommer votre inputstream
avant de commencer l'analyse. Voici un exemple de code: la réponse ci-dessous est httpresponse
(c'est-à-dire une réponse) et le contenu principal est contenu dans StringEntity (i.e. getEntity())in form of inputStream(i.e. getContent())
.
InputStream rescontent = response.getEntity().getContent();
tsResponse=(TsResponse) transformer.convertFromXMLToObject(rescontent );
Si le flux d'entrée n'est pas correctement fermé, cette exception peut se produire. assurez-vous que: Si inputstream utilisé n’est pas utilisé "Avant" d’une manière ou d’une autre, vous êtes censé le lire. c'est-à-dire que si la deuxième fois lue à partir du même flux d'entrée en une seule opération, le deuxième appel obtiendra cette exception. Assurez-vous également de fermer le flux d’entrée dans le bloc enfin ou quelque chose du genre.
Etes-vous sûr que le fichier XML est dans le bon codage de caractères? FileReader
utilise toujours le codage par défaut de la plate-forme. Par conséquent, si le serveur "fonctionnel" avait un codage par défaut de (par exemple) ISO-8859-1 et que le serveur "problème" utilisait UTF-8, vous verriez cette erreur si le XML contient des caractères non-ASCII.
Cela fonctionne-t-il si vous créez le InputSource à partir d'un FileInputStream au lieu d'un FileReader?
Dans notre cas, c’était un AndroidManifest.xml vide.
Lors de la mise à niveau d'Eclispe, nous avons rencontré le problème habituel , et AndroidManifest.xml doit avoir été archivé dans SVN par le script de génération après avoir été vidé.
Vous l'avez trouvé en compilant depuis Eclipse, plutôt qu'avec la ligne de commande.