Публикация статических WSDL и связанных схем XSD с использованием Spring WS - PullRequest
6 голосов
/ 02 марта 2012

У меня есть один модуль, где у меня есть мои XSD-схемы, где одна схема может ссылаться на другую, используя относительный путь в пределах расположения схемы:

<xs:import namespace="http://my.namespace.org" schemaLocation="../mypackage/my.xsd"/>

Здесь я также использую xjc для генерации бинов Jaxb из этихxsd schemas.

Теперь у меня есть модуль, в котором реализован мой веб-сервис с использованием spring-ws (2.0.4).И я хочу использовать статический WSDL и публиковать его со схемами xsd, где местоположения схем будут преобразованы в URL, например 'http://myerver.url.com/my.xsd'.

. Вопрос в том, как элегантнодостичь этого?

(В качестве альтернативы можно объединить XSD в одну схему и в WSDL)

(Теоретически я мог бы преобразовать эти XSD с помощью сценария и добавить их в ресурсы (xsd иwsdl) сервлету (весенний диспетчер), но мне он не очень удобен)

Ответы [ 3 ]

10 голосов
/ 03 октября 2012

Spring web сервис имеет способ сделать это элегантно на самом деле.Все, что вам нужно сделать, это определить компонент SimpleXsdSchema с правильным идентификатором (который будет использоваться как имя xsd без .xsd) в файле XML определения компонента, как показано нижеинформацию (включая пример) можно найти по следующей ссылке: Статический WSDL с импортированной схемой XML в Spring Web Service

1 голос
/ 10 марта 2017

Ниже приведена конфигурация JAva для предоставления схемы.Это сработало для меня.Обратите внимание, что имя схемы должно соответствовать имени Бина и имени метода.Это очень важно, чтобы это работало.Поэтому я сохранил имя XSD и имя Bean как «CustomerDetailsSchema» и убедился, что конструктор для getCustomerDetails также соответствует имени

@Bean(name = "customerDetails")
public DefaultWsdl11Definition getCustomerDetails(XsdSchema CustomerDetailsSchema) {
    DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
    wsdl11Definition.setPortTypeName("...");
    wsdl11Definition.setServiceName("...");
    wsdl11Definition.setLocationUri("/webservice");
    wsdl11Definition.setTargetNamespace("...");
    wsdl11Definition.setSchema(CustomerDetailsSchema);
    return wsdl11Definition;
}

@Bean(name = "CustomerDetailsSchema")
public XsdSchema CustomerDetailsSchema() {
    return new SimpleXsdSchema(new ClassPathResource("schemas/CustomerDetailsSchema.xsd"));
}
0 голосов
/ 12 июля 2019

Вот мое решение для статических WSDL и XSD

@Bean(name = "OpportunityAttachmentService")
public Wsdl11Definition getOpportunityAttachmentServiceDefinition() {
    SimpleWsdl11Definition wsdl11Definition =
            new SimpleWsdl11Definition();
    wsdl11Definition.setWsdl(
            new ClassPathResource(
                    "wsdl/getOpportunityAttachment/BeP_getOpportunityAttachment_cuContract.wsdl"));
    return wsdl11Definition;
}

@Bean(name = "getOpportunityAttachment_Request_CRM")
public XsdSchema getOpportunityAttachmentServiceRequestXsd() {
    return new SimpleXsdSchema(
            new ClassPathResource("wsdl/getOpportunityAttachment/getOpportunityAttachment_Request_CRM.xsd"));
}

@Bean(name = "getOpportunityAttachment_Response_CRM")
public XsdSchema getOpportunityAttachmentServiceResponseXsd() {
    return new SimpleXsdSchema(
            new ClassPathResource("wsdl/getOpportunityAttachment/getOpportunityAttachment_Response_CRM.xsd"));
}
...