Элемент CDATA в клиенте WSDL
Я делаю клиент WSDL и хочу знать, как я могу установить элемент XML в качестве CDATA.
Я использую wsimport для генерации исходного кода, а элемент CDATA является частью XML запроса.
Это класс XML запроса:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "dataRequest" }) 
@XmlRootElement(name = "ProcessTransaction")
public class ProcessTransaction {
    protected String dataRequest;
    public String getDataRequest() {
        return dataRequest;
    }
    public void setDataRequest(String value) {
        this.dataRequest = value;
    }  
} 
Я уже пробовал @XmlAdapter, но это ничего не меняет на выходе...
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class AdaptorCDATA extends XmlAdapter<String, String> {
    @Override
    public String marshal(String arg0) throws Exception {
        return "<![CDATA[" + arg0 + "]]>";
    }
    @Override
    public String unmarshal(String arg0) throws Exception {
        return arg0;
    }
}
в классе XML:
@XmlJavaTypeAdapter(value=AdaptorCDATA.class)
protected String dataRequest;
Я попытался отладить, но он никогда не наступает на
1 ответов
Так как @user1516873 предложил, я переместил код в cxf, и с этим, работает хорошо. Теперь я использую "wsdl2java" для генерации кода и банок из cxf в моем проекте.
что изменилось в коде:
CdataInterceptor
import javax.xml.stream.XMLStreamWriter;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
public class CdataInterceptor extends AbstractPhaseInterceptor<Message> {
    public CdataInterceptor() {
        super(Phase.MARSHAL);
    }
    public void handleMessage(Message message) {
        message.put("disable.outputstream.optimization", Boolean.TRUE);
        XMLStreamWriter writer = (XMLStreamWriter) message.getContent(XMLStreamWriter.class);
        if (writer != null && !(writer instanceof CDataContentWriter)) {
            message.setContent(XMLStreamWriter.class, new CDataContentWriter(writer));
        }
    }
    public void handleFault(Message messageParam) {
        System.out.println(messageParam);
    }
}
CDataContentWriter
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import org.apache.cxf.staxutils.DelegatingXMLStreamWriter;
public class CDataContentWriter extends DelegatingXMLStreamWriter {
    public CDataContentWriter(XMLStreamWriter writer) {
        super(writer);
    }
    public void writeCharacters(String text) throws XMLStreamException {
        boolean useCData = text.contains("RequestGeneric");
        if (useCData) {
            super.writeCData(text);
        } else {
            super.writeCharacters(text);
        }
    }
    // optional 
    public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException {
        super.writeStartElement(prefix, local, uri);
    }
}
использование писателя и перехватчика:
MyService wcf = new MyService(url, qName);
IMyService a = wcf.getBasicHttpBinding();
Client cxfClient = ClientProxy.getClient(a);
CdataInterceptor myInterceptor = new CdataInterceptor();
cxfClient.getInInterceptors().add(myInterceptor);
cxfClient.getOutInterceptors().add(myInterceptor);
и он работает идеально!
