gpt4 book ai didi

java - Spring Boot SOAP WS 端点

转载 作者:行者123 更新时间:2023-12-02 12:49:57 24 4
gpt4 key购买 nike

我正在使用 Spring boot 生成 SOAP WS。我正在使用契约第一的理念来开发它。

我有以下架构

 <?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified"
targetNamespace="www.google.com" version="1.0"
xmlns:tns="www.google.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="CommandRequest" type="tns:CommandRequest"/>
<xs:complexType name="CommandRequest">
<xs:sequence>
<xs:element minOccurs="0" name="enterpriseId" type="xs:string"/>
<xs:element minOccurs="0" name="pwd" type="xs:string"/>
<xs:element minOccurs="0" name="command" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="CommandResponse" type="tns:CommandResponse"/>
<xs:complexType name="CommandResponse">
<xs:sequence>
<xs:element name="code" type="xs:int"/>
<xs:element minOccurs="0" name="message" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>

配置类

@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {

@Bean
public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) {
MessageDispatcherServlet servlet = new MessageDispatcherServlet();
servlet.setApplicationContext(applicationContext);
servlet.setTransformWsdlLocations(true);
return new ServletRegistrationBean(servlet, "/cmd-service/*");
}

@Bean(name = "command")
public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema commandSchema) {
DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
wsdl11Definition.setPortTypeName("CommandServicePort");
wsdl11Definition.setLocationUri("/cmd-service");
wsdl11Definition.setTargetNamespace("www.google.com");
wsdl11Definition.setSchema(commandSchema);
return wsdl11Definition;
}

@Bean
public XsdSchema countriesSchema() {
return new SimpleXsdSchema(new ClassPathResource("CommandService.xsd"));
}
}

端点代码

@Endpoint
public class CommandEndPoint {

private static final String NAMESPACE_URI = "www.google.com";
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "CommandRequest")
@ResponsePayload
public JAXBElement<CommandResponse> command(
@RequestPayload CommandRequest commandRequest) {
}

}

上述代码在 localhost:8090/cmd-service/command.wsdl 公开一个 Web 服务。

我想使用相同的架构公开两个不同的 wsdl(1.localhost:8090/service1/command.wsdl 和 2.localhost:8090/service2/command.wsdl)。有人可以建议我如何解决这个问题吗?

最佳答案

我能够通过扩展 MessageDispatcherServlet 并设置枚举 RequestTypeStore.RequestType 来解决这个问题。

@EnableWs

@配置公共(public)类 WebServiceConfig 扩展 WsConfigurerAdapter {

@Bean
MessageDispatcherServlet servlet() {
return new MessageDispatcherServlet() {
@Autowired
private RequestTypeStore requestStore;
public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {

HttpServletRequest httpReq = (HttpServletRequest) req;
String URI = httpReq.getRequestURI();
if(httpReq.getRequestURI().contains("/dns-service")) {
requestStore.setType(RequestType.DNS_COMMAND);
}
else if (httpReq.getRequestURI().contains("/registry-service")) {
requestStore.setType(RequestType.REGISTRY_COMMAND);
}
else {
requestStore.setType(RequestType.UNKNOWN_COMMAND);
}
super.service(req, resp);

}

};
}

@Bean
public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) {
MessageDispatcherServlet servlet = servlet();
servlet.setApplicationContext(applicationContext);
servlet.setTransformWsdlLocations(true);
return new ServletRegistrationBean(servlet, "/*");
}


@Bean(name = "registry-command")
public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema commandSchema) {
DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
wsdl11Definition.setPortTypeName("CommandServicePort");
wsdl11Definition.setLocationUri("/registry-service");
wsdl11Definition.setTargetNamespace("www.google.com");
wsdl11Definition.setSchema(commandSchema);
wsdl11Definition.setRequestSuffix("");
return wsdl11Definition;
}

@Bean(name = "dns-command")
public DefaultWsdl11Definition defaultWsdl11DefinitionDNS(XsdSchema commandSchema) {
DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
wsdl11Definition.setPortTypeName("CommandServicePort2");
wsdl11Definition.setLocationUri("/dns-service");
wsdl11Definition.setTargetNamespace("www.google.com");
wsdl11Definition.setSchema(commandSchema);
return wsdl11Definition;
}

}

RequestTypeStore实现如下:

@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestTypeStore {

public enum RequestType { DNS_COMMAND,REGISTRY_COMMAND,UNKNOWN_COMMAND};
private RequestType type;
public RequestType getType() {
return type;
}
public void setType(RequestType type) {
this.type = type;
}

关于java - Spring Boot SOAP WS 端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44633841/

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