【问题标题】:Spring boot SOAP WS end pointSpring Boot SOAP WS 端点
【发布时间】:2017-06-19 14:56:22
【问题描述】:

我正在使用 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 暴露了一个 webservice。

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

【问题讨论】:

    标签: java web-services soap spring-boot wsdl


    【解决方案1】:

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

    @EnableWs
    

    @配置 公共类 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;
        }
    

    【讨论】:

      猜你喜欢
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      • 2022-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-04
      相关资源
      最近更新 更多