Правильный способ загрузки XSD упакован в WAR? - PullRequest
3 голосов
/ 15 марта 2011

Я пытаюсь проверить, что XML-файл не распакован в веб-приложении. Сам файл xml находится за пределами каталога развертывания веб-приложения, и соответствующий XSD упакован в WAR, в classpath, в WEB-INF / classes / com / moi

Мне не удалось выяснить, как создать объект Schema, чтобы он выбирал XSD-файл относительно пути к классам по сравнению с жестким кодированием пути относительно рабочего каталога. Я хочу подобрать его относительно пути к классам, чтобы найти его при развертывании приложения (а также при запуске из модульного теста). Пример кода ниже, который работает, ищет его относительно рабочего каталога.

JAXBContext context;
context = JAXBContext.newInstance(Foo.class);
Unmarshaller unMarshaller = context.createUnmarshaller();

SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new File("src/com/moi/foo.xsd"));

unMarshaller.setSchema(schema);
Object xmlObject = Foo.class.cast(unMarshaller.unmarshal(new File("C:\\foo.xml")));
return (Foo) xmlObject;

Среда использует JAXB2 / JDK 1.6.0_22 / JavaEE6. Мысли

Ответы [ 2 ]

8 голосов
/ 15 марта 2011

Вы можете сделать следующее:

ClassLoader classLoader = Foo.class.getClassLoader();
InputStream xsdStream = classLoader.getResourceAsStream("com/moi/foo.xsd");
StreamSource xsdSource = new StreamSource(xsdStream);
Schema schema = sf.newSchema(xsdSource);
0 голосов
/ 05 октября 2017

Если у нас есть несколько XSD, которые используют импорт для них. тогда это не работает. Он загружает только один файл, поэтому не может загрузить другую импортированную схему xsd.

этот ответ работает отлично. https://stackoverflow.com/a/9280611/4498746

...