我有一个模块,我有我的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,但在我看来并不是很舒服)
答案 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; CustomerDetailsSchema&#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"));
}