Как прочитать XML-схему из файла JAR в контексте сервлета - PullRequest
4 голосов
/ 08 марта 2011

У меня есть проект библиотеки maven с некоторыми классами для обработки сообщений XML.Всякий раз, когда я получаю одно из этих сообщений, я проверяю его, используя файл схемы xml, который я написал.Код, который выполняет проверку для меня, выглядит следующим образом:

public static Document parseXML(final String xml) throws JDOMException, IOException {
    SAXBuilder builder = new SAXBuilder("org.apache.xerces.parsers.SAXParser", true);
    builder.setFeature("http://apache.org/xml/features/validation/schema", true);
    URL location = CMPMessage.getClass().getResource(XML_SCHEMA_LOCATION);
    if (null == location) {
        throw new IOException("Unable to load schema definition file.");
    }
    builder.setProperty("http://apache.org/xml/properties/schema/external-schemaLocation",
            "http://www.mycompany.de/MyProtocol " + location);
    return builder.build(new StringReader(xml));
}

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

private static final String XML_SCHEMA_LOCATION = "/ConvertMessageProtocol.xsd";

Файл .xsd находится в src/main/resources, и, спасибоДля maven все работает отлично: файл .xsd включается в .jar, когда указывает maven создать пакет.Я сделал простой тестовый проект, чтобы проверить, действительно ли найден файл .xsd.Исходный код выглядит следующим образом:

import java.io.IOException;
import org.jdom.JDOMException;
import de.mycomp.MyMessage;


public class Main {
    public static void main(final String[] args) {
        try {
            MyMessage.parseXML(args[0]);
        }
        catch (JDOMException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

И да, xml будет проверен с использованием файла схемы.

Теперь вот оно: я хочу использовать свою маленькую библиотеку в сервлете (работает в tomcat), но там файл .xsd не может быть найден: (

Конечно, я мог бы сохранить файл .xsd где-то еще, например, непосредственно на сервере компании, и получить его через http, но ядумаю, что включение его в .jar - лучшее решение, чтобы убедиться, что libs и версия схем подходят.

У вас есть идеи, что здесь не так?

Заранее спасибо:

Джим

1 Ответ

4 голосов
/ 08 марта 2011

assign

private static final String XML_SCHEMA_LOCATION = getPath("/ConvertMessageProtocol.xsd");

public static String getPath(String path){
  return UtilityClass.class.getResource(path).toString();
}

Проблема в том, что ваше приложение сервлета ищет файл в /, где нет файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...