具有一个命名空间和本地部分的多个 SOAP 端点
Multiple SOAP endpoints with one namespace & localpart
我使用 SpringBoot 创建了一个 SOAP Web 服务服务器,并且能够成功创建一个端点。
但是,我无法创建多个端点并使用不同的 URL 访问它们。
我想通过URL访问处理过程。
每个端点接收到的 SOAP 消息具有相同的架构。 (Namespace和localpart是一样的!!!)
而且我不想制作 WSDL public.
例如
userA 将以下 SOAP 消息发送到以下 URL:http://soap.example.com/ws/userA
<S:Envelope>
<SOAP-ENV:Header>
</SOAP-ENV:Header>
<S:Body>
<testsoap:post
xmlns:testsoap="http://soap.example.com/">
<testsoap:message>
I am UserA
</testsoap:message>
</testsoap:post>
</S:Body>
</S:Envelope>
userB 将以下 SOAP 消息发送到 URL:http://soap.example.com/ws/userB
<S:Envelope>
<SOAP-ENV:Header>
</SOAP-ENV:Header>
<S:Body>
<testsoap:post
xmlns:testsoap="http://soap.example.com/">
<testsoap:message>
I am UserB
</testsoap:message>
</testsoap:post>
</S:Body>
</S:Envelope>
源码如下
@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {
@Autowired
CustomConfig customConfig;
@Bean
public ServletRegistrationBean<MessageDispatcherServlet> messageDispatherServlet(ApplicationContext applicationContext) {
MessageDispatcherServlet servlet = new MessageDispatcherServlet();
servlet.setApplicationContext(applicationContext);
servlet.setTransformWsdlLocations(true);
return new ServletRegistrationBean<MessageDispatcherServlet>(servlet, "/ws/*");
}
}
我想在 http://soap.example.com/ws/userA
访问
@Endpoint
public class SoapRequestEndpoint {
private static final String NAMESPACE_URI = "http://soap.example.com/";
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "post")
@ResponsePayload
public JAXBElement<PostResponse> postForA(MessageContext messageContext) {
// do something for userA
}
}
我想在 http://soap.example.com/ws/userB
访问
@Endpoint
public class SoapRequestEndpoint {
private static final String NAMESPACE_URI = "http://soap.example.com/";
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "post")
@ResponsePayload
public JAXBElement<PostResponse> postForB(MessageContext messageContext) {
// do something for userB
}
}
谢谢。
2019 年 9 月 24 日更新
从那以后我一直在努力,但我仍然不明白。
我不认为它写在官方参考中。
你有什么想法吗?
2019 年 10 月 3 日更新
我还没有解决它。
如果是这样的话,就很难工作了。
请帮助某人。
尝试在 WebServiceConfig 中创建一个额外的 Wsdl11Definition 方法 class 并用 @Bean(name = "UserB").
注释该方法
您只显示了 WebServiceConfig class 中的一个片段,我假设 class 中没有这个片段。
您的 class 应该类似于:
@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {
@Autowired
CustomConfig customConfig;
@Bean
public ServletRegistrationBean<MessageDispatcherServlet> messageDispatherServlet(ApplicationContext applicationContext) {
MessageDispatcherServlet servlet = new MessageDispatcherServlet();
servlet.setApplicationContext(applicationContext);
servlet.setTransformWsdlLocations(true);
return new ServletRegistrationBean<MessageDispatcherServlet>(servlet, "/ws/*");
}
}
@Bean(name = "userA")
public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema [randomMethodSchema]) {
DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
wsdl11Definition.setPortTypeName("userAPort");
wsdl11Definition.setLocationUri("/ws");
wsdl11Definition.setTargetNamespace("http://soap.example.com/");
wsdl11Definition.setSchema([randomMethodSchema]);
return wsdl11Definition;
}
@Bean(name = "userB")
public DefaultWsdl11Definition defaultWsdl11Definition2(XsdSchema [randomMethodSchema]) {
DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
wsdl11Definition.setPortTypeName("userBPort");
wsdl11Definition.setLocationUri("/ws");
wsdl11Definition.setTargetNamespace("http://soap.example.com/");
wsdl11Definition.setSchema([randomMethodSchema]);
return wsdl11Definition;
}
@Bean
public XsdSchema [randomMethodSchema]() {
return new SimpleXsdSchema(new ClassPathResource([schema name].xsd));
}
}
HTH
我使用 SpringBoot 创建了一个 SOAP Web 服务服务器,并且能够成功创建一个端点。 但是,我无法创建多个端点并使用不同的 URL 访问它们。 我想通过URL访问处理过程。
每个端点接收到的 SOAP 消息具有相同的架构。 (Namespace和localpart是一样的!!!) 而且我不想制作 WSDL public.
例如
userA 将以下 SOAP 消息发送到以下 URL:http://soap.example.com/ws/userA
<S:Envelope>
<SOAP-ENV:Header>
</SOAP-ENV:Header>
<S:Body>
<testsoap:post
xmlns:testsoap="http://soap.example.com/">
<testsoap:message>
I am UserA
</testsoap:message>
</testsoap:post>
</S:Body>
</S:Envelope>
userB 将以下 SOAP 消息发送到 URL:http://soap.example.com/ws/userB
<S:Envelope>
<SOAP-ENV:Header>
</SOAP-ENV:Header>
<S:Body>
<testsoap:post
xmlns:testsoap="http://soap.example.com/">
<testsoap:message>
I am UserB
</testsoap:message>
</testsoap:post>
</S:Body>
</S:Envelope>
源码如下
@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {
@Autowired
CustomConfig customConfig;
@Bean
public ServletRegistrationBean<MessageDispatcherServlet> messageDispatherServlet(ApplicationContext applicationContext) {
MessageDispatcherServlet servlet = new MessageDispatcherServlet();
servlet.setApplicationContext(applicationContext);
servlet.setTransformWsdlLocations(true);
return new ServletRegistrationBean<MessageDispatcherServlet>(servlet, "/ws/*");
}
}
我想在 http://soap.example.com/ws/userA
访问@Endpoint
public class SoapRequestEndpoint {
private static final String NAMESPACE_URI = "http://soap.example.com/";
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "post")
@ResponsePayload
public JAXBElement<PostResponse> postForA(MessageContext messageContext) {
// do something for userA
}
}
我想在 http://soap.example.com/ws/userB
访问@Endpoint
public class SoapRequestEndpoint {
private static final String NAMESPACE_URI = "http://soap.example.com/";
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "post")
@ResponsePayload
public JAXBElement<PostResponse> postForB(MessageContext messageContext) {
// do something for userB
}
}
谢谢。
2019 年 9 月 24 日更新
从那以后我一直在努力,但我仍然不明白。
我不认为它写在官方参考中。
你有什么想法吗?
2019 年 10 月 3 日更新
我还没有解决它。
如果是这样的话,就很难工作了。
请帮助某人。
尝试在 WebServiceConfig 中创建一个额外的 Wsdl11Definition 方法 class 并用 @Bean(name = "UserB").
注释该方法您只显示了 WebServiceConfig class 中的一个片段,我假设 class 中没有这个片段。
您的 class 应该类似于:
@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {
@Autowired
CustomConfig customConfig;
@Bean
public ServletRegistrationBean<MessageDispatcherServlet> messageDispatherServlet(ApplicationContext applicationContext) {
MessageDispatcherServlet servlet = new MessageDispatcherServlet();
servlet.setApplicationContext(applicationContext);
servlet.setTransformWsdlLocations(true);
return new ServletRegistrationBean<MessageDispatcherServlet>(servlet, "/ws/*");
}
}
@Bean(name = "userA")
public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema [randomMethodSchema]) {
DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
wsdl11Definition.setPortTypeName("userAPort");
wsdl11Definition.setLocationUri("/ws");
wsdl11Definition.setTargetNamespace("http://soap.example.com/");
wsdl11Definition.setSchema([randomMethodSchema]);
return wsdl11Definition;
}
@Bean(name = "userB")
public DefaultWsdl11Definition defaultWsdl11Definition2(XsdSchema [randomMethodSchema]) {
DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
wsdl11Definition.setPortTypeName("userBPort");
wsdl11Definition.setLocationUri("/ws");
wsdl11Definition.setTargetNamespace("http://soap.example.com/");
wsdl11Definition.setSchema([randomMethodSchema]);
return wsdl11Definition;
}
@Bean
public XsdSchema [randomMethodSchema]() {
return new SimpleXsdSchema(new ClassPathResource([schema name].xsd));
}
}
HTH