[英]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://.../"><username>TestUser</username><password>TestPass</password></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.