2013-09-09 6 views
5

У меня есть веб-служба RESTful, которую я развертываю на Tomcat 6 с Java 1.6, с которой я наблюдаю странное поведение. Я использую этот файл войны примерно с 5 другими файлами войны. Веб-приложение, о котором идет речь, также периодически отправляет сообщение о состоянии на удаленный сервер в формате xml, все привязки XML выполняются с помощью JAXB 2.1.13. После первоначального развертывания привязка JAXB не работает должным образом. То есть, если я начну кота и ждать сообщения о состоянии для отправки я получаю следующее сообщение об ошибке:javax.xml.bind.JAXBException: класс <ClassName> или какой-либо из его суперкласса известен этому контексту

javax.xml.bind.JAXBException: class StatusMessage nor any of its super class is known to this context. 

(я оставил вне полное имя класса для краткости), также все входящие запросы к RESTful службы бросить то же исключение.

Я не вижу этой проблемы, если я упаковываю ВСЕ библиотеки в каждой войне, но я стараюсь этого не делать, потому что мои файлы WAR были чрезвычайно раздуты. Библиотеки JAX упакованы в эту войну, но вещи как Spring, commons- *, hibernate, находятся в tomcat/lib. Есть ли у кого-нибудь идеи, что может вызвать эту странную чувствительность к порядку размещения?

Вот немного больше кода детали, каждый раз, когда сообщение о состоянии тревоги происходит следующее:

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); 

makeXML вызов выглядит следующим образом:

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"); 
} 

Линия маршалом, где исключение бросается. Кажется, что контекст JAXB должен создаваться каждый раз, когда это выполняется.

Обновление, разворачивание/перераспределение не всегда исправляет эту проблему, однако она все же упаковывает все библиотеки. Есть ли статический объект, о котором я должен знать?

ответ

7

В вашем коде вы создаете объект JAXBContext, в котором перечислены все классы Java, которые могут быть отсортированы и/или немаркированы. Довольно часто передавать имя пакета или ObjectFactory, чтобы он знал о множестве классов. Сообщение об ошибке заставляет звучать так, как будто эти классы в контексте не находятся в пути к классам в момент построения JAXBContext.

Просматривайте код и найдите, где этот экземпляр JAXBContext построен и проверьте, какие классы Java установлены. Тот факт, что он работает после перенастройки, заставляет меня думать, что это проблема класса; возможно, некоторые из классов не загружаются в путь к классам до остальной части кода.

Ваши load-on-startup значения в вашем web.xml также могут содержать некоторые подсказки.

+0

К сожалению, ни одно предложение не осветило проблему. – KillerTofu

0

Моя команда столкнулась с тем же сообщением об ошибке. В нашем случае рассматриваемый класс был в двух файлах jar, и похоже, что более старая версия загружалась в JAXBContext. После того, как дублированные файлы классов были очищены, проблема была исправлена.