如何更改“SOAP-ENV” Spring-WS的默认前缀 [英] How to change "SOAP-ENV" default prefix of Spring-WS

查看:259
本文介绍了如何更改“SOAP-ENV” Spring-WS的默认前缀的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用Spring-WS创建了一个Web服务。
为了保持与旧系统的兼容性,我需要将名称空间前缀从 SOAP-ENV 更改为 soap

I've created a web service using Spring-WS. To maintain compatibility with the old system, I need to change namespace prefix from SOAP-ENV to soap.

我知道 SOAP-ENV soap 只是名称空间前缀。
只要它们引用了正确的命名空间(http://schemas.xmlsoap.org/soap/envelope/),它应该没问题。

I know that SOAP-ENV and soap are just namespace prefixes. As long as they refer to the correct namespace ("http://schemas.xmlsoap.org/soap/envelope/"), it should be fine.

但旧系统硬编码解析器代码只能期望 soap 名称空间前缀。

But the old system hard coded the parser code to expect only soap namespace prefix.

当前回复:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
   ...
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

预期回复:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Header/>
   <soap:Body>
   ...
   </soap:Body>
</soap:Envelope>

这是我到目前为止所尝试的内容


  1. 创建 EndpointInterceptorAdapter 子类。这将拦截SOAP响应/错误并更改SOAP信封。
    这样可行,但在性能方面并不理想。

  1. Create EndpointInterceptorAdapter subclass. This will intercept SOAP response/fault and alter the SOAP envelope. This works, but it's not ideal in terms of performance.

public class CustomEndpointInterceptor extends EndpointInterceptorAdapter {

  private static final String DEFAULT_NS = "xmlns:SOAP-ENV";
  private static final String SOAP_ENV_NAMESPACE = "http://schemas.xmlsoap.org/soap/envelope/";
  private static final String PREFERRED_PREFIX = "soap";
  private static final String HEADER_LOCAL_NAME = "Header";
  private static final String BODY_LOCAL_NAME = "Body";
  private static final String FAULT_LOCAL_NAME = "Fault";

  @Override
  public boolean handleResponse(MessageContext messageContext, Object endpoint) throws Exception {
    SaajSoapMessage soapResponse = (SaajSoapMessage) messageContext.getResponse();
    alterSoapEnvelope(soapResponse);
    return super.handleResponse(messageContext, endpoint);
  }

  @Override
  public boolean handleFault(MessageContext messageContext, Object endpoint) throws Exception {
    SaajSoapMessage soapResponse = (SaajSoapMessage) messageContext.getResponse();
    alterSoapEnvelope(soapResponse);
    return super.handleFault(messageContext, endpoint);
  }

  private void alterSoapEnvelope(SaajSoapMessage soapResponse) {
    Document doc = soapResponse.getDocument();
    Element rootElement = doc.getDocumentElement();
    rootElement.setPrefix(PREFERRED_PREFIX);
    // Remove default SOAP namespace
    rootElement.removeAttribute(DEFAULT_NS);
    NodeList headerNodes = doc.getElementsByTagNameNS(SOAP_ENV_NAMESPACE, HEADER_LOCAL_NAME);
    NodeList bodyNodes = doc.getElementsByTagNameNS(SOAP_ENV_NAMESPACE, BODY_LOCAL_NAME);
    NodeList faultNodes = doc.getElementsByTagNameNS(SOAP_ENV_NAMESPACE, FAULT_LOCAL_NAME);
    // Remove Header node.
    if (headerNodes.getLength() != 0) {
      rootElement.removeChild(headerNodes.item(0));
    }
    // Change Body's SOAP namespace prefix.
    if (bodyNodes.getLength() != 0) {
      Element bodyElement = (Element) bodyNodes.item(0);
      bodyElement.setPrefix(PREFERRED_PREFIX);
    }
    if (faultNodes.getLength() != 0) {
      Element faultElement = (Element) faultNodes.item(0);
      faultElement.setPrefix(PREFERRED_PREFIX);
    }
  }
}


  • 更改<$包含WSDL生成的类的包中的c $ c> package-info.java 。
    我用公司的名称空间前缀成功完成了这项工作,但它不适用于 SOAP-ENV 前缀。

    @javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.com/ns/2008/02/02/webservices/blah",
    xmlns = {
      @javax.xml.bind.annotation.XmlNs(namespaceURI = "http://www.example.com/ns/2008/02/02/webservices/blah", prefix = ""),
      @javax.xml.bind.annotation.XmlNs(namespaceURI = "http://schemas.example.com/ns/2007/10/blah", prefix = "ns2"),
      @javax.xml.bind.annotation.XmlNs(namespaceURI = "http://example.com/ns/2007/23/05/blah/fundamental", prefix = "ns3"),
      @javax.xml.bind.annotation.XmlNs(namespaceURI = "http://schemas.xmlsoap.org/soap/envelope/", prefix = "soap") // doesn't work
    },
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
    package com.thomsonreuters.ts.ets.interdayws.soap.webservice;
    


  • 是否有理想的方式来改变<$在Spring-WS中c $ c> SOAP-ENV 到 soap

    Is there an ideal way to change SOAP-ENV to soap in Spring-WS?

    By顺便说一句,这是设置此前缀的代码。
    StroapElement.java

    By the way, here's the code that set this prefix. StroapElement.java

    推荐答案

    更好的解决方案



    使用 SOAPMessage API 而不是DOM。

      private void alterSoapEnvelope(SaajSoapMessage soapResponse) {
        try {
          SOAPMessage soapMessage = soapResponse.getSaajMessage();
          SOAPPart soapPart = soapMessage.getSOAPPart();
          SOAPEnvelope envelope = soapPart.getEnvelope();
          SOAPHeader header = soapMessage.getSOAPHeader();
          SOAPBody body = soapMessage.getSOAPBody();
          SOAPFault fault = body.getFault();
          envelope.removeNamespaceDeclaration(envelope.getPrefix());
          envelope.addNamespaceDeclaration(PREFERRED_PREFIX, SOAP_ENV_NAMESPACE);
          envelope.setPrefix(PREFERRED_PREFIX);
          header.setPrefix(PREFERRED_PREFIX);
          body.setPrefix(PREFERRED_PREFIX);
          if (fault != null) {
            fault.setPrefix(PREFERRED_PREFIX);
          }
        } catch (SOAPException e) {
          e.printStackTrace();
        }
      }
    

    现在快得多。

    这篇关于如何更改“SOAP-ENV” Spring-WS的默认前缀的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆