Apache CXF wsdl2java ツールを使用して Web サービス クライアントを作成しました。正常に動作しますが、ある方法では、特殊文字を含む文字列を送信する必要があります。生成されたクライアントはエスケープ文字を使用します。私はそれを望んでいません。「<[!CDATA[ ]]>」ブロック内に文字列を配置したい。コードに「<[!CDATA[ ]]>」を手動で追加できます。これは問題にはなりませんが、cachracter エスケープをオフにする方法がわかりません。そんな悩みを抱えている人はいませんか?最も簡単な方法でそれを修正する方法は?
[編集]: ダニエル・クルプの回答の後、私はこれを行いました:
私はインターセプターを書きました:
public class CDATAInterceptor extends AbstractPhaseInterceptor<Message> {
public CDATAInterceptor(String phase) {
super(phase);
}
public void handleMessage(Message message) {
XMLStreamWriter writer = (XMLStreamWriter) message.getContent(XMLStreamWriter.class);
if (writer != null && !(writer instanceof MyXmlWriter)) {
message.setContent(XMLStreamWriter.class, new MyXmlWriter(writer));
}
}
}
私はそれを可能なフェーズに追加しました(念のため-おそらくMARSHALまたはPRE_MARSHALに入れる必要があります)。インターセプターを追加するコードは次のとおりです。
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));
...
MyXmlWriter クラス コードは次のとおりです。
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);
}
}
これは機能しません。私はそれがどのように機能するかを確認するためにデバッグしてきましたが、 MyXmlWriter.writeCharacters(...) メソッドがほとんど使用されていないことに気付きました。出力メッセージには、CDATA 内ではなく、エスケープ文字がまだ含まれています。
[編集2]:次の行を追加する必要があることがわかりました:
message.put("disable.outputstream.optimization", Boolean.TRUE);
ソース: http://cxf.547215.n5.nabble.com/CXF-jaxb-send-string-as-CData-td5524523.html