gpt4 book ai didi

java - 具有一个 namespace 和本地部分的多个 SOAP 端点

转载 作者:行者123 更新时间:2023-12-02 02:54:50 25 4
gpt4 key购买 nike

我使用 SpringBoot 创建了一个 SOAP Web 服务服务器,并且能够成功创建一个端点。但是,我无法创建多个端点并使用不同的 URL 访问它们。我想处理通过URL访问的过程。

每个端点接收到的 SOAP 消息具有相同的架构。 (命名空间和本地部分是相同的!!!)而且我不想公开 WSDL。

例如。

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 方法,并使用 @Bean(name = "UserB") 注释该方法。

您只显示了 WebServiceConfig 类中的一个片段,我假设该类中不存在该片段。

您的类(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

关于java - 具有一个 namespace 和本地部分的多个 SOAP 端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57901622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com