我正在使用CXF使用Web服务,我需要在CDATA标记内发送XML。 为此,我创建了一个拦截器
public class CDATAInterceptor extends AbstractPhaseInterceptor<Message> {
public CDATAInterceptor() {
super(Phase.MARSHAL);
//addAfter(AttachmentOutInterceptor.class.getName());
}
@Override
public void handleMessage(Message message) {
message.put("disable.outputstream.optimization", Boolean.TRUE);
XMLStreamWriter writer = (XMLStreamWriter) message.getContent(XMLStreamWriter.class);
if (writer != null && !(writer instanceof CDataXMLStreamWriter)) {
message.setContent(XMLStreamWriter.class, new CDataXMLStreamWriter(writer));
}
}
public void handleFault(Message messageParam) {
System.out.println(messageParam);
}
}
我正在使用如下定义的自定义CDATAXMLStreamWriter:
public class CDataXMLStreamWriter extends DelegatingXMLStreamWriter {
private static final Pattern XML_CHARS = Pattern.compile( "[&<>]" );
public CDataXMLStreamWriter(XMLStreamWriter del) {
super(del);
}
@Override
public void writeCharacters(String text) throws XMLStreamException {
boolean useCData = XML_CHARS.matcher( text ).find();
if (useCData) {
super.writeCData(text);
}else {
super.writeCharacters(text);
}
}
public void writeStartElement(String local) throws XMLStreamException {
super.writeStartElement(local);
}
}
我按如下方式配置了这个CDATA拦截器
protected void configureCDataInterceptor() {
CDATAInterceptor inter = new CDATAInterceptor();
ClientProxy.getClient(this.clientProxy).getOutInterceptors().add(inter);
}
我遇到的问题是CDATA中的xml分为多个部分,就像这样
<![CDATA[part1ofXML]]><![CDATA[part2ofXML]]><![CDATA[part3ofXML]]>
我尝试获取XML并删除所有换行符,并且XML进入一个CDATA块,但问题是此XML已签名,删除字符会破坏签名。
我希望这很清楚,如果帖子很难理解,那就很抱歉。 如果你能给我一个解决这个问题的线索,那就太好了!
谢谢, 胡