如何使用Dynamic SOAP发布WSDL定义:使用Spring-WS地址位置



我想根据持有它们的环境更改WSDL的<soap:address location="..."/>。例如:

开发:<soap:address location="https://development.xxx.yyy.zz/abc/ws/"/>

测试:<soap:address location="https://testing.xxx.yyy.zz/abc/ws/"/>

生产:<soap:address location="https://production.xxx.yyy.zz/abc/ws/"/>

如果要使用WSDL基本文件,并且只需根据环境更改肥皂地址位置属性,请使用此类:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.sax.SAXSource;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.io.Resource;
import org.springframework.util.StringUtils;
import org.springframework.ws.wsdl.wsdl11.SimpleWsdl11Definition;
import org.springframework.ws.wsdl.wsdl11.Wsdl11Definition;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
public class DynamicUrlWsdlDefinition implements Wsdl11Definition, InitializingBean {
  private static final String SOAP_ADDRESS_LOCATION_XPATH_EXPRESSION = "/definitions/service/port/address/@location";
  private static final String SOAP_ADDRESS_LOCATION_URI_PART_1 = "https://";
  private static final String SOAP_ADDRESS_LOCATION_URI_PART_3 = ".xxx.yyy.zz/abc/ws/";
  private String wsEnvironment;
  private SimpleWsdl11Definition delegate;
  public DynamicUrlWsdlDefinition() {
    this.setDelegate(new SimpleWsdl11Definition());
  }
  @Override
  public Source getSource() {
    try {
      final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
      final DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
      final Document document = documentBuilder.parse(((SAXSource) this.getDelegate().getSource()).getInputSource());
      final XPath xPath = XPathFactory.newInstance().newXPath();
      final Node locationAttributeNode = (Node) xPath.compile(SOAP_ADDRESS_LOCATION_XPATH_EXPRESSION)
          .evaluate(document, XPathConstants.NODE);
      locationAttributeNode.setTextContent(SOAP_ADDRESS_LOCATION_URI_PART_1 + this.getWsEnvironment() + SOAP_ADDRESS_LOCATION_URI_PART_3);
      return new DOMSource(document);
    } catch (Exception e) {
      return this.getDelegate().getSource();
    }
  }
  private String getWsEnvironment() {
    if (!StringUtils.hasText(wsEnvironment) || "${ws.environment}".equals(wsEnvironment)) {
      this.setWsEnvironment("NO_DEFINED");
    }
    return wsEnvironment;
  }
  @Override
  public void afterPropertiesSet() throws Exception {
    this.getDelegate().afterPropertiesSet();
  }
  public void setWsdl(final Resource wsdlResource) {
    this.getDelegate().setWsdl(wsdlResource);
  }
  private SimpleWsdl11Definition getDelegate() {
    return delegate;
  }
  private void setDelegate(final SimpleWsdl11Definition delegate) {
    this.delegate = delegate;
  }
  public void setWsEnvironment(final String wsEnvironment) {
    this.wsEnvironment = wsEnvironment;
  }
}

并声明这个春天的豆:

<bean id="pingoServiceWsdl" class="DynamicUrlWsdlDefinition">
    <property name="wsdl" value="classpath:/pingoService.wsdl"/>
    <property name="wsEnvironment" value="${ws.environment}"/>
</bean>

我只有相同的要求,并且随着时间的流逝,给定解决方案不满意。实际上,在我的项目中,我使用的是Spring-Boot 2.2.5.Release,并且我管理了设置位置URI,如下所示:

    @Bean(name = "MyServiceWsdl")
    public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema countriesSchema) 
    {
        DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
        wsdl11Definition.setPortTypeName("MyServiceSoapBinding");
        wsdl11Definition.setTargetNamespace("https://www.kleenxcoder.com/xml/myproject");
        wsdl11Definition.setSchema(countriesSchema);
        wsdl11Definition.setLocationUri("xxx.xxx.xxxx:8080/service/MyService");
        return wsdl11Definition;
    }

最新更新