Hello Asankha,
I have done your proposed solution, but another problem arrived, this is my
ApplicationXMLFormatter class:
package razu.synapse;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMOutputFormat;
import org.apache.axiom.soap.SOAP11Constants;
import org.apache.axiom.soap.SOAP12Constants;
import org.apache.axiom.soap.SOAPFault;
import org.apache.axiom.soap.SOAPFaultDetail;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.transport.MessageFormatter;
import org.apache.axis2.transport.http.util.URLTemplatingUtil;
import org.apache.axis2.util.JavaUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.xml.stream.XMLStreamException;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.URL;
public class ApplicationXMLFormatter extends
org.apache.axis2.transport.http.ApplicationXMLFormatter {
private static final Log log =
LogFactory.getLog(ApplicationXMLFormatter.class);
@Override
public void writeTo(MessageContext messageContext, OMOutputFormat
format,
OutputStream outputStream, boolean preserve) throws AxisFault {
if (log.isDebugEnabled()) {
log.debug("start writeTo()");
}
try {
OMElement omElement = null;
if (messageContext.getFLOW() == MessageContext.OUT_FAULT_FLOW) {
SOAPFault fault = messageContext.getEnvelope().getBody()
.getFault();
SOAPFaultDetail soapFaultDetail = fault.getDetail();
if (soapFaultDetail != null) {
omElement = soapFaultDetail.getFirstElement();
}
if (omElement == null) {
omElement = fault.getReason();
}
} else {
omElement = messageContext.getEnvelope().getBody()
.getFirstElement();
}
if (omElement != null) {
try {
PrintWriter out = new PrintWriter(new
OutputStreamWriter(outputStream));
out.println("<?xml version=\"1.0\"
encoding=\"utf-8\"?>");
if (preserve) {
omElement.serialize(outputStream, format);
} else {
omElement.serializeAndConsume(outputStream, format);
}
} catch (XMLStreamException e) {
throw AxisFault.makeFault(e);
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
}
try {
outputStream.flush();
} catch (IOException e) {
throw AxisFault.makeFault(e);
}
} finally {
if (log.isDebugEnabled()) {
log.debug("end writeTo()");
}
}
}
}
This is rewrited method from original ApplicationXMLFormatter, I only added
PrintWriter out = new PrintWriter(new
OutputStreamWriter(outputStream));
out.println("<?xml version=\"1.0\"
encoding=\"utf-8\"?>");
I created JAR with this class and copy it to /lib directory
Another thing to do was change axis2.xml :
...
<messageFormatter contentType="application/xml"
class="razu.synapse.ApplicationXMLFormatter"/>
...
My class is used by Apache Synapse, but output XML is still without XML
header.
Have you any idea what I done wrong?
2008/12/16 Asankha C. Perera <[email protected]>
> Hi Zimny
>
>> ...
>> <soapenv:Body xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
>> <name>RAZU</name>
>> </soapenv:Body>
>> ...
>>
>> and only <name>RAZU</name> is send to extenal service, but I need to send:
>>
>> <?xml version="1.0"?>
>> <name>RAZU</name>
>>
>> What is your suggestions?
>>
>>
> Usually the XML declaration is not sent, nor expected.. One solution is to
> extend the message formatter to include the declaration..
>
> cheers
> asankha
>
> --
> Asankha C. Perera
> http://adroitlogic.org
>
> http://esbmagic.blogspot.com
>
>