【问题标题】:How to set soap header in Spring Integration?如何在 Spring Integration 中设置soap标头?
【发布时间】:2016-03-11 17:32:23
【问题描述】:

我想用 Spring Integration 发送一个肥皂消息。我使用 Java 配置。 我已经尝试了flolowing拦截器,但是spring集成将尖括号()转换为html转义字符。

import org.springframework.ws.client.WebServiceClientException;
import org.springframework.ws.client.support.interceptor.ClientInterceptor;
import org.springframework.ws.context.MessageContext;
import org.springframework.ws.soap.SoapHeader;
import org.springframework.ws.soap.SoapHeaderElement;
import org.springframework.ws.soap.SoapMessage;

public class MyAuthInterceptor implements ClientInterceptor {
    @Override
    public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
        SoapMessage soapMessage = (SoapMessage) messageContext.getRequest();
        SoapHeader sh = soapMessage.getSoapHeader();
        QName name = new QName("http://...", "myAuth", "aut");
        sh.addHeaderElement(name).setText("<username>TestUser</username>" + "<password>TestPass</password>");
        return true;
    }

这是生成的soap头:

<SOAP-ENV:Header>
    <aut:myAuth xmlns:aut="http://.../">&lt;username&gt;TestUser&lt;/username&gt;&lt;password&gt;TestPass&lt;/password&gt;</aut:myAuth>
</SOAP-ENV:Header>

这是我的配置:

@Configuration
@EnableIntegration
public class SpringIntegrationConfiguration {

    @Bean
    public PublishSubscribeChannel inputChannel() {
        return new PublishSubscribeChannel();
    }

    @Bean
    public ClientInterceptor myAuthInterceptor() {
        return new MyAuthInterceptor();
    }

    @Bean
    @ServiceActivator(inputChannel = "inputChannel")
    public SimpleWebServiceOutboundGateway myOutput(ClientInterceptor mekAuthInterceptor) {
        SimpleWebServiceOutboundGateway simpleWebServiceOutboundGateway = new SimpleWebServiceOutboundGateway("http://...");
        simpleWebServiceOutboundGateway.setInterceptors(myAuthInterceptor);
        return simpleWebServiceOutboundGateway;
    }
}

如何在不转义尖括号的情况下设置肥皂标题?

【问题讨论】:

    标签: java spring soap spring-integration


    【解决方案1】:

    您必须使用addChildElements 来构建它,而不是将其设置为文本。

    【讨论】:

      【解决方案2】:

      您正在将标签设置为文本,因为它被添加到 xml 中,所以它会转义字符串。这些需要设置为元素

      http://docs.oracle.com/javaee/5/api/javax/xml/soap/SOAPHeaderElement.html

      检查上面文档中的方法并适当地使用它。如果您需要更多帮助,请发表评论。

      【讨论】:

      • 我使用 Spring 而不是 JAVA EE。所以你的解决方案不能解决我的问题。
      【解决方案3】:

      @gary-russell - 从逻辑的角度来看,您的回答是有道理的,但 org.springframework.ws.soap. 中没有“addChildElement”方法。我在 javax.xml.soap 中找到了它们。.

      所以我的结果如下所示:

      import javax.xml.XMLConstants;
      import javax.xml.namespace.QName;
      import javax.xml.soap.SOAPElement;
      import javax.xml.soap.SOAPException;
      import javax.xml.soap.SOAPHeader;
      import javax.xml.soap.SOAPHeaderElement;
      import javax.xml.soap.SOAPMessage;
      
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      import org.springframework.ws.client.WebServiceClientException;
      import org.springframework.ws.client.support.interceptor.ClientInterceptor;
      import org.springframework.ws.context.MessageContext;
      import org.springframework.ws.soap.SoapMessage;
      import org.springframework.ws.soap.saaj.SaajSoapMessage;
      
      public class MySecurityInterceptor implements ClientInterceptor
      {
          private static final Logger log = LoggerFactory.getLogger(MySecurityInterceptor.class);
      
          @Override
          public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException
          {
              SoapMessage soapMessage = (SoapMessage) messageContext.getRequest();
      
              QName securityName = new QName(
                  "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
                  "Security",
                  XMLConstants.DEFAULT_NS_PREFIX);
      
              QName usernameToken = new QName(null, "UsernameToken", XMLConstants.DEFAULT_NS_PREFIX);
      
              QName username = new QName(null, "Username", XMLConstants.DEFAULT_NS_PREFIX);
      
              QName password = new QName(null, "Password", XMLConstants.DEFAULT_NS_PREFIX);
      
              try
              {
                  SOAPMessage mySoapMessage = ((SaajSoapMessage) soapMessage).getSaajMessage();
      
                  SOAPHeader header = mySoapMessage.getSOAPHeader();
      
                  SOAPHeaderElement securityElement = header.addHeaderElement(securityName);
      
                  SOAPElement usernameTokenElement = securityElement.addChildElement(usernameToken);
      
                  SOAPElement usernameElement = usernameTokenElement.addChildElement(username);
      
                  SOAPElement passwordElement = usernameTokenElement.addChildElement(password);
      
                  usernameElement.setTextContent("jxep-Zenmonics-1-i101@jxtest.local");
                  passwordElement.setTextContent("3Sg%T~1q4z!QnH6#+5pD");
              }
              catch (SOAPException e)
              {
                  log.error("Error!", e);
              }
      
              return true;
          }
      
          @Override
          public boolean handleResponse(MessageContext messageContext) throws WebServiceClientException
          {
              // Auto-generated method stub
              return false;
          }
      
          @Override
          public boolean handleFault(MessageContext messageContext) throws WebServiceClientException
          {
              // Auto-generated method stub
              return false;
          }
      
          @Override
          public void afterCompletion(MessageContext messageContext, Exception ex) throws WebServiceClientException
          {
              // Auto-generated method stub
          }
      }
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多