If you are willing to use SAAJ (and assuming CXF 2.4.1), you could try
something like:
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.xml.soap.SOAPMessage;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.phase.PhaseInterceptor;
public class MyInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
private List<PhaseInterceptor<? extends Message>> extras
= new ArrayList<PhaseInterceptor<? extends Message>>(1);
private XPath xpath = XPathFactory.newInstance().newXPath();
public MyInterceptor() {
super(Phase.POST_PROTOCOL);
extras.add(new SAAJOutInterceptor());
}
public Collection<PhaseInterceptor<? extends Message>>
getAdditionalInterceptors() {
return extras;
}
public void handleMessage(SoapMessage message) throws Fault {
SOAPMessage msg = message.getContent(SOAPMessage.class);
try {
removeNodes("idJustification", msg.getSOAPBody());
removeNodes("indicRdv", msg.getSOAPBody());
} catch (Exception e) {
throw new Fault(e);
}
}
private synchronized void removeNodes(String path, Element el) throws
XPathExpressionException {
NodeList l = (NodeList)xpath.evaluate("//" + path, el,
XPathConstants.NODESET);
if (l != null) {
for (int x = 0; x < l.getLength(); x++) {
Element el2 = (Element)l.item(0);
el2.getParentNode().removeChild(el2);
}
}
}
}
On Tuesday, August 02, 2011 7:47:29 PM [email protected] wrote:
> Hi everyone (this is my first post on this mailing-list)
>
> I would like to modify an outgoing SOAP Request. I would like to remove 2
> xml nodes from the Envelope's body. I managed to set up an Interceptor and
> get the generated String value of the message set to the endpoint.
>
> However, the following code does not seem to work as the outgoing message is
> not edited as expected. Does anyone have some code or ideas on how to do
> this?
>
> public class MyOutInterceptor extends AbstractSoapInterceptor {
>
> public MyOutInterceptor() {
> super(Phase.SEND);
> }
>
> public void handleMessage(SoapMessage message) throws Fault {
> // Get message content for dirty editing...
> StringWriter writer = new StringWriter();
> CachedOutputStream cos =
> (CachedOutputStream)message.getContent(OutputStream.class);
> InputStream inputStream = cos.getInputStream();
> IOUtils.copy(inputStream, writer, "UTF-8");
> String content = writer.toString();
>
> // remove the substrings from envelope...
> content = content.replace("<idJustification>0</idJustification>",
> "");
> content = content.replace("<indicRdv>false</indicRdv>", "");
> ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
> outputStream.write(content.getBytes(Charset.forName("UTF-8")));
> message.setContent(OutputStream.class, outputStream);
> }
>
> Am I missing something? What is a better way to to this?
> It seems too complicated to achieve my pretty simple requirement...
--
Daniel Kulp
[email protected]
http://dankulp.com/blog
Talend - http://www.talend.com