Erreur unmarshalling xml en java-8 “sécuriser le traitement de org.xml.sax.SAXNotRecognizedException provoquant java.lang.IllegalStateException”
Le code suivant a bien fonctionné dans Java 7
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
String xmlString = '<xml ..... ';
StringReader reader = new StringReader(xmlString);
JAXBContext jc = JAXBContext.newInstance(MyClass.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
MyClass myClass = (MyClass) unmarshaller.unmarshal(reader);
....
Maintenant, nous avons eu à la mise à niveau vers Java 8 et maintenant, je reçois cette exception lors de l'exécution du code:
Sep 03, 2014 1:42:47 PM com.sun.xml.internal.bind.v2.util.XmlFactory createParserFactory
SCHWERWIEGEND: null
org.xml.sax.SAXNotRecognizedException: Feature: http://javax.xml.XMLConstants/feature/secure-processing
at org.apache.xerces.jaxp.SAXParserFactoryImpl.setFeature(SAXParserFactoryImpl.java:100)
at com.sun.xml.internal.bind.v2.util.XmlFactory.createParserFactory(XmlFactory.java:114)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.getXMLReader(UnmarshallerImpl.java:139)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:214)
Je sais qu'il y a un question ciblant un problème similaire, mais à prendre du recul pour java 7 n'est pas une solution pour moi.
J'ai essayé d'ajouter le suivant maven dependency
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxp-api</artifactId>
<version>1.4</version>
</dependency>
mais cela ne change pas le résultat, donc je l'ai enlevé (merci à @BlaiseDoughan pour l'information, que ce qui est inclus dans la version 6 de Java)
Tous les conseils sont les bienvenus, merci beaucoup.
Vous devez vous connecter pour publier un commentaire.
Nous avons eu un problème similaire - notre développeur de tête de trouvé une solution qui fonctionne pour nous.
Nous avons ajouté cette dépendance à un couple de notre pom.xml fichiers
Pour les soins, les tests unitaires dans Sonar qui ne ont apparemment échoué car Cobatura par défaut tire dans une ancienne version de xerces. La version qu'il tire est incompatible avec JAX-B dans Java 8. La bibliothèque n'est pas utilisé dans le code de production – juste Cobatura. Par conséquent, la solution était d'ajouter un test de dépendance à une version plus récente de xerces (2.11.0). Cela se fait par l'ajout de la dépendance à la pom fichier:
Xerces impl est le principal coupable ici. Le supprimer. Jdk a intégré jaxb de l'analyseur, vous n'en avez pas besoin.
donc, si cette dépendance est à venir à partir d'un projet parent en cas de maven
l'utilisation d'une exclusion de l'onglet dans le cas où vous ne pouvez pas le supprimer.
La raison de ce problème est si difficile à détecter est parce que, quand on a l'habitude d'écrire un jaxb unmarshalling code
vous allez faire un unmarshalling sur un bloc try et ensuite de prendre jaxb exception et ensuite faire tout à l'erreur.
Mais ce coupable de l'analyseur d'un bocal (xercesimpl) lève une exception d'exécution dans le milieu provoquant l'erreur de ne pas
se connecté et seront seulement être détectée après l'attention de débogage. Regardez l'extrait de code ci-dessous
Ici xercesImpl causes de la unmarshaller utiliser un autre analyseur sax (au lieu de l'ordinaire jaxb parser)
l'amenant à lancer de différentes exception qui
de ne pas être pris dans notre bloc catch qui s'attend à une jaxbexception ou un de ses sous-classes.
mvn dependency:tree -Dverbose -Dincludes=xerces
. Maintenant, lisez l'arbre pour savoir qui de la dépendance est de le charger.xercesImpl
comme ci-dessus pour la dépendancejaxen:jaxen
fixe le construire.junit-addons:junit-addons
Une autre solution possible à ce problème est d'ajouter des variables du système:
J'ai utilisé ces dans le maven plugin tomcat qui a fonctionné pour moi:
Mais vous devez également être en mesure de définir comme suit:
ou même l'utilisation du Système.setProperty:
C'était un problème de dépendance.
Voici ma façon de comment j'ai résolu le problème:
Copier vos dépendances dans le projet pom.xml maintenant le programme doit se bloquer (comme décrit ci-dessus)
pas de vous supprimer les dépendances après votre méthode privilégiée (de bons deviner, non-bloquante , 1-par-1 ..) pour trouver le "mauvais" de la dépendance. Peut-être que quelqu'un a une meilleure (plus professionnel) de la méthode, celui-ci a fonctionné pour moi.
maintenant, vous pouvez descide quoi faire, peut-être une nouvelle version est disponible, dans notre cas, il était hors forfait d'un collègue, où il a inclus un paquet d'un collègue, que j'ai pu exclure.
et la testXML classe
BTW: Dans mon cas, c'était
Espère que ça aide.
org.apache.maven.plugins:maven-dependency-plugin:2.10:tree
De mise en œuvre de JAXB a été inclus dans Java SE depuis la version 6. Si vous retirez la dépendance Maven (qui est probablement à l'origine d'un conflit de version), tout devrait fonctionner.
Les deux Bernard et Blaise réponses ont été très utiles. Dans mon cas, depuis que je suis à l'aide du JDK 7, la solution est à exclure la xerces subdependency qui a été inclus par l'un de mes dépendances:
J'ai résolu ce problème sur mon projet avec la deuxième Mitch solution, mais juste avec
À l'aide de SAXparser peut être un cauchemar. C'est le plus largement utilisé parser XML en java et tous ont fini par utiliser soit directement ou indirectement. JDK 8 ont JAXB déjà disponibles . Donc, si vous utilisez le JDK 8, puis seule voie possible devrait être en retrait de la dépendance maven.
J'ai eu ce problème j'ai donc essayé de supprimer la dépendance maven, mais n'était pas arrivé. Alors j'ai pensé pourquoi ne pas revenir à l'ancienne version si java et VOILLA j'ai eu de la réussite. Je suis à l'aide du jdk 7 actuellement et mes tests se passent bien. Je suppose que c'est la seule solution.
Essayez de créer un Document XML et unmarshal il. Il a travaillé pour moi.
JAXBContext jc = JAXBContext.newInstance( Message.class );
Nous avons également rencontré le problème et a remarqué que vous avez besoin de garder la version du jdk et jre version de la même, sinon existent à l'incompatibilité de version qui a causé le problème.
Le gars qui a rencontré le problème de l'utilisation jdk1.6 et jre 1.8, lorsqu'elles sont modifiées à la fois jdk1.6, la question disparu.
J'ai eu étaient confrontés au même problème, ce problème se produit lorsqu'il y a une grande différence dans les versions de xerces bocal et xercesImpl jar. Pour résoudre cela, j'ai utilisé xerces-2.9.0 et xercesImpl-2.9.1 et le problème à disparu.