我试图在一个弹簧部署中创建两个单独的Web服务,两者都使用相同的xsd模式生成wsdl,但是将它们路由到两个单独的端点,这样我就可以在不同的上下文中以不同的方式处理请求.
例如:
Webservice 1:访问子集,较低权限和安全性约束
Webservice 2:更高的权限
<sws:dynamic-wsdl id="spml-readonly"
portTypeName="SpmlReadOnlyService"
locationUri="SpmlReadOnly">
<sws:xsd location="/WEB-INF/xsd/spml/pstc_spmlv2_core.xsd"/>
</sws:dynamic-wsdl>
<sws:dynamic-wsdl id="spml-crud"
portTypeName="SpmlCrudService"
locationUri="SpmlCrud">
<sws:xsd location="/WEB-INF/xsd/spml/pstc_spmlv2_core.xsd"/>
<sws:xsd location="/WEB-INF/xsd/spml/pstc_spmlv2_search.xsd"/>
<sws:xsd location="/WEB-INF/xsd/spml/pstc_spmlv2_batch.xsd"/>
</sws:dynamic-wsdl>
Run Code Online (Sandbox Code Playgroud)
现在因为两个wsdl都基于相同的xsds,所以请求的'namespace'和'localPart'都是相同的,无论我正在点击哪个Web服务(/ SpmlReadOnly或/ SpmlCrud).
因此,由于localPart和命名空间仍然完全相同等,因此排除了已弃用的PayloadRootQNameEndpointMapping,并且我的当前配置只是将请求路由到同一端点方法处理程序,我无法区分调用哪个Web服务:
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "lookupRequest")
@ResponsePayload
public Source handleLookupRequest(SoapMessage message) throws Exception {
...
}
Run Code Online (Sandbox Code Playgroud)
我能做什么甚至可能?如果xsd是共享的并且在模式的根目录中具有相同的名称空间,并且相同的localPart方法请求,那么是否有办法区分它们并映射到两个不同的端点?有关这方面的任何信息都很有用!我希望我不必设置两个单独的.wars,并在服务器上使用自己的代码库单独部署它们!
谢谢,达米安
我需要实现一个SPML接口,它最终通过 HTTP(s) 执行 SOAP 请求。我有一个 wsdl 可以归结为:
<wsdl:types>
<schema targetNamespace="http://soapadapter.something" xmlns="http://www.w3.org/2001/XMLSchema">
<element name="receiveRequest" type="xsd:anyType"/>
</schema>
</wsdl:types>
[...]
<wsdl:operation name="receiveRequest">
<wsdl:input message="impl:receiveRequestRequest" name="receiveRequestRequest"/>
</wsdl:operation>
Run Code Online (Sandbox Code Playgroud)
如您所见,唯一定义的请求元素是“xsd:anyType”类型。我有一个单独的 xsd,在 wsdl 中根本没有链接,它描述了应该如何形成请求。
我想使用 zeep 来实现使用接口的 SOAP 请求。我怎样才能让 zeep 知道那个(本地)xsd 文件?
我找到了这个zeep.xsd.schema.SchemaDocument类,但没有在任何地方使用它的例子。有人可以给我一个如何创建使用 wsdl 和单独的 xsd 文件的客户端的使用示例吗?