簡體   English   中英

如何在 Spring Integration 中設置肥皂頭?

[英]How to set soap header in Spring Integration?

我想用 Spring Integration 發送一個 soap 消息。 我使用 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-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;
    }
}

如何在不轉義尖括號的情況下設置肥皂頭?

您必須使用addChildElement來構建它,而不是將其設置為文本。

您將標簽設置為文本,因為字符串被添加到 xml 中,因此該文本會轉義字符串。 那些需要設置為元素

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

檢查上面文檔中的方法並適當地使用它。 如果您需要更多幫助,請發表評論。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM