javax.xml.bind.JAXBException: classe <ClassName> ni aucune de ses super-classe est connue à ce contexte
J'ai un service web RESTful qui je suis déploiement sur Tomcat 6 avec la version 1.6 de Java que je vois un comportement étrange. Je suis le déploiement de cette guerre en particulier de fichier avec environ 5 autres fichiers war. La web app en question envoie périodiquement un message d'état à distance de serveur au format xml, tous les XML de liaison est faite avec JAXB 2.1.13. Le JAXB liaison ne semble pas fonctionner correctement après le déploiement initial. C'est-à-dire, si je démarre tomcat et attendez que l'état du message envoyé, j'obtiens l'erreur suivante:
javax.xml.bind.JAXBException: class StatusMessage nor any of its super class is known to this context.
(J'ai laissé de côté le nom de classe entièrement qualifié par souci de concision) Également toutes les demandes entrantes pour le service RESTful jeter la même exception.
Je ne vois pas ce problème si je le package de TOUTES les bibliothèques dans chaque guerre, mais je vais essayer de ne pas le faire parce que mes fichiers WAR devenaient extrêmement gonflé.JAX bibliothèques sont emballés dans cette guerre, mais des choses comme le Printemps, communes-*, hibernate, sont dans tomcat/lib. Quelqu'un a une idée de ce qui pourrait être la cause de cette étrange ordre de déploiement de la sensibilité?
Voici un peu plus de code en détail, à chaque fois le message d'état est déclenché le suivant se produit:
JAXBElement<StatusMessage> el = ( new ObjectFactory() ).createHeartbeat( statusMessage );
ApiUtils apiUtil = new ApiUtils();
NamespaceFilter outFilter = new NamespaceFilter("http://middleware/status", true);
String xml = apiUtil.makeXml( el, "com.package.path.status", ApiUtils.getFormatXMLSetting(), ApiUtils.getValidateXMLSetting(), outFilter);
La makeXML appel ressemble à ceci:
public String makeXml(JAXBElement el, String packageName, Boolean formatXml, Boolean validateXml, NamespaceFilter outFilter) throws JAXBException,
SAXException, UnsupportedEncodingException, IOException{
//Marshal XML
JAXBContext jaxbContext = JAXBContext.newInstance( packageName );
Marshaller marshaller = jaxbContext.createMarshaller();
OutputFormat format = new OutputFormat();;
if (formatXml){
format.setIndent(true);
format.setNewlines(true);
}
//Create a filter that will remove the xmlns attribute
if(outFilter == null)
outFilter = new NamespaceFilter(null, false);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if ( validateXml ) {
SchemaFactory schemaFactory = SchemaFactory.newInstance( "http://www.w3.org/2001/XMLSchema" );
InputStream is = this.getClass().getClassLoader().getResourceAsStream( packageName.replaceAll( "\\.", "/" ) + "/schema.xsd" );
Source source = new StreamSource( is );
Schema schema = schemaFactory.newSchema( source );
//This line enforces schema validation
marshaller.setSchema( schema );
}
XMLWriter writer = new XMLWriter(baos, format);
outFilter.setContentHandler(writer);
marshaller.marshal( el, outFilter );
return baos.toString( "UTF-8" );
}
Marshall ligne est l'endroit où l'exception est levée. Il semble que le JAXB contexte doit être créé chaque fois qu'il est exécuté.
Mise à jour, annulant le déploiement/redéploiement ne permet pas toujours de résoudre ce problème, cependant l'emballage de tous les libs avec elle. Est-il un objet statique quelque part, j'ai besoin d'être au courant?
OriginalL'auteur KillerTofu | 2013-09-09
Vous devez vous connecter pour publier un commentaire.
Quelque part dans votre code, vous créez un
JAXBContext
objet qui répertorie toutes les classes Java qui peuvent être placés et/ou unmarhsalled. Il est assez fréquent de passer un nom de package ou un ObjectFactory pour qu'il connaît beaucoup de classes. Le message d'erreur le fait ressembler à ceux des classes dans le contexte ne sont pas dans le chemin de classe au moment de laJAXBContext
est en cours de construction.Trace dans le code et trouver où ce
JAXBContext
exemple est construit et découvrez ce que les classes Java. Le fait que cela fonctionne après redploying me font penser que c'est un problème de classpath; peut-être certaines classes ne sont pas chargés dans le chemin de classe avant le reste du code est.Votre
load-on-startup
valeurs dans votreweb.xml
pourrait également donner quelques conseils.OriginalL'auteur austin
Mon équipe a couru dans le même message d'erreur. Dans notre cas, la classe en question était dans les deux fichiers jar et il semble que l'ancienne version a été chargé dans le JAXBContext. Une fois les doublons de fichiers de classe ont été nettoyé, le problème était résolu.
OriginalL'auteur kman