From http://cxf.547215.n5.nabble.com/CXF-jaxb-send-string-as-CData-td5524523.html
Finalmente no he necesitado usarlo, pero lo guardo por si algún día…
public class CdataWriterInterceptor extends AbstractPhaseInterceptor<Message> { public CdataWriterInterceptor() { super(Phase.PRE_STREAM); addAfter(AttachmentOutInterceptor.class.getName()); } @Override public void handleMessage(Message message) { message.put("disable.outputstream.optimization", Boolean.TRUE); XMLStreamWriter writer = StaxUtils.createXMLStreamWriter(message.getContent(OutputStream.class)); message.setContent(XMLStreamWriter.class, new CDataXMLStreamWriter(writer)); } }
public class CDataXMLStreamWriter extends DelegatingXMLStreamWriter { private String currentElementName; public CDataXMLStreamWriter(XMLStreamWriter del) { super(del); } @Override public void writeCharacters(String text) throws XMLStreamException { boolean useCData = checkIfCDATAneededForCurrentElement(); if (useCData) { System.out.println("WritingCData" + text); super.writeCData(text); }else { super.writeCharacters(text); } } private boolean checkIfCDATAneededForCurrentElement() { if("MessageBody".equals(currentElementName)) return true; return false; } public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException { currentElementName = local; super.writeStartElement(prefix, local, uri); } }
Gracias
Una pregunta
¿ cómo se selecciona el campo que quiero envolver en CDATA ?
Veo un «checkIfCDATAneededForCurrentElement()» pero no parece que seleccione ningun campo en concreto
No lo he usado, pues realmente el servidor al final me aceptaba sin poner CDATA. No llegué a comprenderlo, falta de tiempo.
Este código lo vi en los foros de CXF, me pareció interesante no olvidarlo y por ello lo publiqué.
un saludo
JMPrieto