У меня есть класс, который unmarshals xml из стороннего источника (я не имею никакого контроля над содержимым).Вот фрагмент, который unmarshals:
JAXBContext jContext = JAXBContext.newInstance("com.optimumlightpath.it.aspenoss.xsd");
Unmarshaller unmarshaller = jContext.createUnmarshaller() ;
StringReader xmlStr = new StringReader(str.value);
Connections conns = (Connections) unmarshaller.unmarshal(xmlStr);
Connections
- это класс, созданный dtd-> xsd-> class с использованием xjc.Пакет com.optimumlightpath.it.aspenoss.xsd
содержит все такие классы.
Получаемый мною xml содержит относительный путь в DOCTYPE.В основном str.value
выше содержит:
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<!DOCTYPE Connections SYSTEM "./dtd/Connections.dtd">
<Connections>
...
</Connections>
Это успешно работает как приложение Java 1.5.Чтобы избежать вышеуказанной ошибки, мне нужно было создать каталог ./dtd вне корня проекта и включить все файлы dtd (не знаю, почему я должен был это сделать, но мы вернемся к этому).
С тех пор я создал веб-сервис на Tomcat5.5, который использует вышеуказанный класс.Я получаю [org.xml.sax.SAXParseException: Relative URI "./dtd/Connections.dtd"; can not be resolved without a document URI.]
на линии маршала.Я пытался создать ./dtd в каждой соответствующей папке (корень проекта, WebContent, WEB-INF, рабочий каталог tomcat и т. Д.), Но безрезультатно.
Вопрос № 1: Где я могу найти ./dtd, чтобы класс мог найти его при запуске в качестве веб-службы tomcat?Есть ли какая-либо конфигурация tomcat или службы, которую мне нужно сделать, чтобы распознать каталог?
Вопрос # 2: Почему классу вообще нужен файл dtd?Разве у него нет всей необходимой информации для аннотации в аннотациях класса dtd-> xsd->?Я читал много постов об отключении проверки, настройке EntityResource и других решениях, но этот класс не всегда развертывается как веб-сервис, и я не хочу иметь две последовательности кода.