Hi,

We have a requirement to apply XSLT to incoming request XML and outgoing 
response XML within CXF interceptors (to avoid changes to the endpoint code).

We have used the following approach to modify the response XML and would 
appreciate your comments to see whether this is an acceptable approach or not. 
Note that the interceptor is registered at "pre-stream".

try (OutputStream outputStream = message.getContent(OutputStream.class);
     CachedOutputStream cachedStream = new CachedOutputStream();
     InputStream resourceInputStream = resource.getInputStream()) {

    message.setContent(OutputStream.class, cachedStream);

    //Allow other interceptors execution so that finally output stream will be 
populated with outgoing message.
    message.getInterceptorChain().doIntercept(message);

    //flush the stream so that we can see/extract the message.
    cachedStream.flush();

    //Get the xml message on which you want to apply transformation.
    Source inputSource = getInputSource(message);
    
    Source xslt = new StreamSource(resourceInputStream);
    Transformer transformer = transformerFactory.newTransformer(xslt);
    StreamResult streamResult = new StreamResult(outputStream);

    transformer.transform(inputSource, streamResult);

    outputStream.flush();
    message.setContent(OutputStream.class, outputStream);
    if(LOGGER.isDebugEnabled()){
        //TODO response needs to be logged
        LOGGER.debug("Transformed response: "+new 
String(((CachedOutputStream)outputStream).getBytes()));
    }
}

It seems to work but we're worried about any side effects.

Many thanks
Mandy

Sent from a mobile device

Reply via email to