当前位置: 首页 > 知识库问答 >
问题:

如何用动态SOAP发布WSDL定义:使用Spring-WS的地址定位

丘学海
2023-03-14

我希望根据保存WSDL的环境更改它们的 。例如:

production: ion="“https://production.xxx.yyy.zz/abc/ws/”/">

共有1个答案

巢靖
2023-03-14

如果您希望使用WSDL基文件并根据环境更改SOAP地址位置属性,请使用此类:

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;
  }

}

并声明这个Spring bean:

<bean id="pingoServiceWsdl" class="DynamicUrlWsdlDefinition">
    <property name="wsdl" value="classpath:/pingoService.wsdl"/>
    <property name="wsEnvironment" value="${ws.environment}"/>
</bean>
 类似资料:
  • 问题内容: 我有一个模块,其中有我的XSD模式,其中一个模式可以使用模式位置内的相对路径引用另一个模式: 在这里,我还使用xjc从这些xsd模式生成Jaxb bean。 现在,我有了一个使用spring-ws(2.0.4)实现我的Web服务的模块。我想使用 静态WSDL 并将其与xsd模式一起发布,其中模式位置将转换为URL,例如“ http://myerver.url.com/my.xsd”。

  • 我正在研究Spring-WS,它基于手动创建的XSD生成WSDL。 我试图使用Spring-WS将Spring Controller RESTFul API服务公开为WSDL。 那么如何在spring webservice调用时传递{customer-id}呢?如何在spring wsdl定义中指定这个url?

  • 我有一个由Apache CXF WS生成的WSDL,如下所示 在application.java中 关于我的服务实现

  • 我正在尝试编写一个SOAP Web服务: 接受一种请求类型 A 将请求 A 映射到另一个出站请求类型 B 将请求 B 发送到外部 SOAP 服务 将响应 B 映射回响应 A 对象(并返回它) 当endpoint(B)静态配置时,我有这个工作。 但我希望能够使用不同的请求/响应类型来访问各种服务。这些可能通过属性文件进行配置。 有没有可能以某种通用/动态的方式做到这一点? 这是我的Spring骆驼X

  • 问题内容: 使用Spring-WS时,如何在客户端动态设置自定义HTTP标头(不是SOAP标头)? 问题答案: 配置:

  • 我已经构建了一个定制的gradle插件,我正试图将其发布到一个私有的maven repo。我使用插件来实现这一点。在经历了很多麻烦之后,我查看了google play services插件的实现(https://github.com/google/play-services-plugins/blob/master/google-services-plugin/publish.gradle)并试图复