У меня есть веб-служба 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 должен создаваться каждый раз, когда это выполняется.
Обновление, разворачивание/перераспределение не всегда исправляет эту проблему, однако она все же упаковывает все библиотеки. Есть ли статический объект, о котором я должен знать?
К сожалению, ни одно предложение не осветило проблему. – KillerTofu