spring-ws: Изменение заголовка Soap с помощью ClientInterceptor

#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()

Можно ли манипулировать текстом сообщения для этого или необходимо использовать совершенно другой подход ?