Разоблачить jar-ресурсы через Интернет - PullRequest
3 голосов
/ 06 апреля 2010

У меня есть веб-сервис (с Spring-WS ).

У меня есть банка с несколькими схемами (schema1.xsd, schema2.xsd и schema3.xsd), которые явключите в мой веб-сервис.

Есть ли способ как-то выставить схемы из jar-файла через сервлет в моем приложении wep веб-сервиса?

My Spring MessageDispatcherServlet сопоставлен с /ws /

Я бы хотел, чтобы мои схемы были выставлены на /schemas/schema1.xsd /schemas/schema2.xsd и т. д.

У меня есть идея, как это сделать с сервлетом, но он слишком многословен идолжен быть более хороший путь.

Я имею в виду фильтр сервлетов и все, что попадает в / схемы / проверяет, присутствует ли он в моем списке разрешенных ресурсов, и отображает его.

Это должно быть независимым от серверарешение.(Например, http://tuckey.org/urlrewrite/ не будет работать).

Спасибо.

Ответы [ 4 ]

3 голосов
/ 07 апреля 2010

Я снова! Увидев комментарии к вашему первоначальному вопросу, я решил предложить альтернативное решение.

Если я понимаю вашу проблему, похоже, у вас есть WSDL (созданный Spring-WS), который содержит ссылки на различные схемы. Когда клиент пытается следовать этим ссылкам схемы, он терпит неудачу, потому что нет такого ресурса.

Spring-WS предлагает хороший выход из этого, который описан в разделе о воздействии WSDL :

Если вы хотите использовать несколько схем, либо включает или импортирует, вы может захотеть использовать CommonsXsdSchemaCollection и ссылаются к тому из DefaultWsdl11Definition, вот так:

<bean id="schemaCollection" class="org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection">
    <property name="xsds">
        <list>
            <value>classpath:/path/to/schema1.xsd</value>
            <value>classpath:/path/to/schema2.xsd</value>
        </list>
    </property>
    <property name="inline" value="true"/>
</bean>

Когда встроенное свойство включено, это следует за всем импортом XSD и включает и включает их в WSDL. Это значительно упрощает Развертывание схем, которые до сих пор позволяя редактировать их отдельно.

Таким образом, вы получаете сгенерированный WSDL со всеми встроенными ссылочными схемами, поэтому не содержит ссылок для клиента, чтобы следовать. Это очень удобно и означает, что вам не нужно показывать файлы схемы по отдельности.

2 голосов
/ 06 апреля 2010

Единственный способ, которым я нашел это в прошлом, это наличие контроллера Spring (или сервлета, каким бы ни был ваш яд), который открывает поток для ресурса в JAR (например, с использованием Class.getResourceAsStream) и затем «отправляет» его в ответ HTTP (используя IO Apache Commons IOUtils.copy()).

Это не очень хорошо, но это полностью общее решение (просто параметризовать его с помощью classpath ресурса).

Вот мой источник для этого:

@Controller
public class ResourceController {

    private Resource resource;

    @Required
    public void setResource(Resource resource) {
        this.resource = resource;
    }

    @RequestMapping
    public void handleRequest(HttpServletResponse httpResponse) throws IOException {
        InputStream resourceStream = resource.getInputStream();
        try {
            IOUtils.copy(resourceStream, httpResponse.getOutputStream());
        } finally {
            resourceStream.close();
        }
    }

}
0 голосов
/ 17 июня 2011

Извините, это не совсем "ответ", но мне нужно еще 4 очка, прежде чем я смогу оставить комментарий. Я хотел получить это здесь, и, возможно, избавить кого-то еще от многих неприятностей, которые я только что прошел.

Я обнаружил, что если у вас есть только один xsd, он будет объединен с wsdl при использовании только DefaultWsdl11Definition, но если вы используете блок <sws:dynamic-wsdl> для генерации wsdl, он просто создает ссылку на файл xsd, который может или может быть не то, что вы хотите. Это не сработало для меня, когда я пытался использовать клиент .NET для запуска службы.

0 голосов
/ 06 апреля 2010

Просто упакуйте свои XSD в войну, называемую schemas.war, поместите файл по умолчанию web.xml и разверните войну в любом веб-контейнере, который вы используете.Это самый простой способ решить проблему без кода.

...