使用Spring WS发布静态WSDL和相关的XSD架构

时间:2012-03-02 09:52:44

标签: java spring xsd wsdl spring-ws

我有一个模块,我有我的XSD架构,其中一个架构可以使用架构位置中的相对路径引用另一个架构:

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

这里我也使用xjc从这些xsd架构生成Jaxb bean。

现在我有一个模块,我的网络服务是使用spring-ws(2.0.4)实现的。我想使用静态WSDL 并使用xsd架构发布它,其中架构位置将转换为URL,如“http://myerver.url.com/my.xsd”。

问题是如何优雅地实现这一目标?

(或者将XSD组合成一个模式,将其组合到WSDL中)

(理论上我可以使用脚本转换这些XSD并将它们添加到资源(xsd和wsdl)到(spring dispatcher)servlet,但在我看来并不是很舒服)

3 个答案:

答案 0 :(得分:10)

Spring Web服务实际上可以优雅地实现它。 您需要做的就是在bean定义xml文件中定义一个具有正确id的SimpleXsdSchema bean(将用作没有.xsd的xsd名称),如下所示

<bean id="my" 
        class="org.springframework.xml.xsd.SimpleXsdSchema">
        <property 
            name="xsd" 
            value="/mypackage/my.xsd">
        </property>
</bean>

更多信息(包括示例)可在以下链接中找到: Static WSDL with imported XML Schema in Spring Web Service

答案 1 :(得分:1)

下面是用于公开架构的JAva配置。这对我有用。请注意,模式名称应与Bean名称和方法名称匹配。这是非常关键的工作。 所以我将XSD名称和Bean名称保留为&#34; CustomerDetailsS​​chema&#34;并确保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"));
}

答案 2 :(得分:0)

这是我针对静态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"));
}