title: Apache CXF wsdl2java client - string in CDATA instead of escape characters
body: <p>I have ganerated webservice client using Apache CXF wsdl2java tool. It work fine, but in one method I have to send string that contain special characters. Generated client use escape characters. I do not want that. I want to place the string inside "&lt;[!CDATA[ ]]>" block. I can add "&lt;[!CDATA[ ]]>" manually in the code - that wont be a problem, but I have no idea how turn off cachracter escaping. Have anyone problem like that? How to fix it in the simplest way?</p>
  
  <p>[Edit]: After Daniel Kulp answer I did this:</p>
  
  <p>I have written interceptor:</p>
  
  <pre><code>public class CDATAInterceptor extends AbstractPhaseInterceptor&lt;Message&gt; {
  
      public CDATAInterceptor(String phase) {
          super(phase);
      }
  
      public void handleMessage(Message message) {
          XMLStreamWriter writer = (XMLStreamWriter) message.getContent(XMLStreamWriter.class);
          if (writer != null &amp;&amp; !(writer instanceof MyXmlWriter)) {
              message.setContent(XMLStreamWriter.class, new MyXmlWriter(writer));
          }
      }
  }
  </code></pre>
  
  <p>I have added it to any possible phase (just in case - i probably should put in in MARSHAL or PRE_MARSHAL). Here is code how i add interceptors:</p>
  
  <pre><code>MyService service = new MyService(new URL(http://my_url_adress?wsdl));
  proxy = service.getMyServiceSoap12();
  Client client = ClientProxy.getClient(proxy);
  
  client.getOutInterceptors().add(new CDATAInterceptor(Phase.INVOKE));
  client.getOutInterceptors().add(new CDATAInterceptor(Phase.MARSHAL));
  client.getOutInterceptors().add(new CDATAInterceptor(Phase.MARSHAL_ENDING));
  client.getOutInterceptors().add(new CDATAInterceptor(Phase.POST_INVOKE));
  client.getOutInterceptors().add(new CDATAInterceptor(Phase.POST_LOGICAL));
  client.getOutInterceptors().add(new CDATAInterceptor(Phase.POST_LOGICAL_ENDING));
  ...
  </code></pre>
  
  <p>Here is MyXmlWriter class code:</p>
  
  <pre><code>public class MyXmlWriter implements XMLStreamWriter {
  
      protected XMLStreamWriter originalXmlWriter;
  
      public MyXmlWriter(XMLStreamWriter originalXmlWriter) {
          this.originalXmlWriter = originalXmlWriter;
      }
  
      public void writeStartElement(String localName) throws XMLStreamException {
          this.originalXmlWriter.writeStartElement(localName);
      }
  
      public void writeStartElement(String namespaceURI, String localName) throws XMLStreamException {
          this.originalXmlWriter.writeStartElement(namespaceURI, localName);
      }
  
      public void writeStartElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {
          this.originalXmlWriter.writeStartElement(prefix, localName, namespaceURI);
      }
  
      public void writeEmptyElement(String namespaceURI, String localName) throws XMLStreamException {
          this.originalXmlWriter.writeEmptyElement(namespaceURI, localName);
      }
  
      public void writeEmptyElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {
          this.originalXmlWriter.writeEmptyElement(prefix, localName, namespaceURI);
      }
  
      public void writeEmptyElement(String localName) throws XMLStreamException {
          this.originalXmlWriter.writeEmptyElement(localName);
      }
  
      public void writeEndElement() throws XMLStreamException {
          this.originalXmlWriter.writeEndElement();
      }
  
      public void writeEndDocument() throws XMLStreamException {
          this.originalXmlWriter.writeEndDocument();
      }
  
      public void close() throws XMLStreamException {
          this.originalXmlWriter.close();
      }
  
      public void flush() throws XMLStreamException {
          this.originalXmlWriter.flush();
      }
  
      public void writeAttribute(String localName, String value) throws XMLStreamException {
          this.originalXmlWriter.writeAttribute(localName, value);
      }
  
      public void writeAttribute(String prefix, String namespaceURI, String localName, String value) throws XMLStreamException {
          this.originalXmlWriter.writeAttribute(prefix, namespaceURI, localName, value);
      }
  
      public void writeAttribute(String namespaceURI, String localName, String value) throws XMLStreamException {
          this.originalXmlWriter.writeAttribute(namespaceURI, localName, value);
      }
  
      public void writeNamespace(String prefix, String namespaceURI) throws XMLStreamException {
          this.originalXmlWriter.writeNamespace(prefix, namespaceURI);
      }
  
      public void writeDefaultNamespace(String namespaceURI) throws XMLStreamException {
          this.originalXmlWriter.writeDefaultNamespace(namespaceURI);
      }
  
      public void writeComment(String data) throws XMLStreamException {
          this.originalXmlWriter.writeComment(data);
      }
  
      public void writeProcessingInstruction(String target) throws XMLStreamException {
          this.originalXmlWriter.writeProcessingInstruction(target);
      }
  
      public void writeProcessingInstruction(String target, String data) throws XMLStreamException {
          this.originalXmlWriter.writeProcessingInstruction(target, data);
      }
  
      public void writeCData(String data) throws XMLStreamException {
          this.originalXmlWriter.writeCData(data);
      }
  
      public void writeDTD(String dtd) throws XMLStreamException {
          this.originalXmlWriter.writeDTD(dtd);
      }
  
      public void writeEntityRef(String name) throws XMLStreamException {
          this.originalXmlWriter.writeEntityRef(name);
      }
  
      public void writeStartDocument() throws XMLStreamException {
          this.originalXmlWriter.writeStartDocument();
      }
  
      public void writeStartDocument(String version) throws XMLStreamException {
          this.originalXmlWriter.writeStartDocument(version);
      }
  
      public void writeStartDocument(String encoding, String version) throws XMLStreamException {
          this.originalXmlWriter.writeStartDocument(encoding, version);
      }
  
      public void writeCharacters(String text) throws XMLStreamException {
          this.originalXmlWriter.writeCData(text);
      }
  
      public void writeCharacters(char[] text, int start, int len) throws XMLStreamException {
          this.originalXmlWriter.writeCData(String.copyValueOf(text, len, len));
      }
  
      public String getPrefix(String uri) throws XMLStreamException {
          return this.originalXmlWriter.getPrefix(uri);
      }
  
      public void setPrefix(String prefix, String uri) throws XMLStreamException {
          this.originalXmlWriter.setPrefix(prefix, uri);
      }
  
      public void setDefaultNamespace(String uri) throws XMLStreamException {
          this.originalXmlWriter.setDefaultNamespace(uri);
      }
  
      public void setNamespaceContext(NamespaceContext context) throws XMLStreamException {
          this.originalXmlWriter.setNamespaceContext(context);
      }
  
      public NamespaceContext getNamespaceContext() {
          return this.originalXmlWriter.getNamespaceContext();
      }
  
      public Object getProperty(String name) throws IllegalArgumentException {
          return this.originalXmlWriter.getProperty(name);
      }
  }
  </code></pre>
  
  <p>This do not work. I have been debuging to check how it works and I notice that MyXmlWriter.writeCharacters(...) method in almost never used. Output message still have escape characters instead of being inside CDATA.</p>
  
  <p>[Edit2]: 
  I just found that I have to add line:</p>
  
  <pre><code>message.put("disable.outputstream.optimization", Boolean.TRUE); 
  </code></pre>
  
  <p>source: <a href="http://cxf.547215.n5.nabble.com/CXF-jaxb-send-string-as-CData-td5524523.html" rel="nofollow">http://cxf.547215.n5.nabble.com/CXF-jaxb-send-string-as-CData-td5524523.html</a></p>