#java #xslt #soap #spring-ws #ws-security
Вопрос:
Я использую spring-ws 2.4.7 и пытаюсь использовать XSLT для удаления некоторых элементов в заголовке Soap, когда происходит сбой мыла.
Хак, который я в настоящее время использую для удаления всего мыльницы, — это:
class RemoveSoapHeaderInterceptor extends ClientInterceptorAdapter {
@Override
public boolean handleFault(org.springframework.ws.context.MessageContext messageContext) throws WebServiceClientException {
try {
((SaajSoapMessage)messageContext.getResponse()).getSaajMessage().getSOAPHeader().detachNode();
} catch (SOAPException e) {
throw new RuntimeException("Unable to delete soap Header",e);
}
return true;
}
}
Я хотел бы выяснить, как использовать XSLT для этого, так как есть некоторые другие манипуляции с SOAPHeader, которые я хотел бы выполнить в сообщении запроса. Приведенный ниже код захватывает содержимое
Мыльное тело в отличие от всего мыльного конверта
поэтому код XSLT не работает.
Код должен расширить клиентский интерпретатор, так как служба является прокси-сервером, который обрабатывает несколько списков WSDL и не имеет специальных знаний о схеме.
Код, который я использую для управления сообщением с помощью XSLT, выглядит так
RemoveSoapHeaderInterceptor.java:
import org.springframework.ws.WebServiceMessage;
import org.springframework.ws.client.WebServiceClientException;
import org.springframework.ws.client.support.interceptor.ClientInterceptor;
import org.springframework.ws.context.MessageContext;
class RemoveSoapHeaderInterceptor extends TransformInterceptor {
@Override
public boolean handleFault(MessageContext messageContext) throws WebServiceClientException {
//Grabs the SoapBody contents , but should reference the Soap Envelope
WebServiceMessage response = messageContext.getResponse();
transform(response, "remove-header.xslt");
return true;
}
}
TransformInterceptor.java:
import org.springframework.ws.WebServiceMessage;
import org.springframework.ws.client.WebServiceTransformerException;
import org.springframework.ws.client.support.interceptor.ClientInterceptorAdapter;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamSource;
import java.io.File;
public abstract class TransformInterceptor extends ClientInterceptorAdapter {
public void transform(WebServiceMessage response, String xsltFile) {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Source source = response.getPayloadSource();
try {
StreamSource xslSource = new StreamSource(new File(
TransformInterceptor.class.getResource(xsltFile).getFile()
));
Transformer modifyingTransformer = transformerFactory.newTransformer(xslSource);
modifyingTransformer.transform(source, response.getPayloadResult());
} catch (TransformerException e) {
throw new WebServiceTransformerException("Unable to modify message", e);
}
}
}
remove-header.xslt
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
>
<xsl:output method="xml" indent="no"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="soap:Header">
<!-- remove -->
</xsl:template>
</xsl:stylesheet>
Я понимаю, что это то, что улавливает неправильную часть сообщения:
WebServiceMessage response = messageContext.getResponse()
Можно ли манипулировать текстом сообщения для этого или необходимо использовать совершенно другой подход ?