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