1.使用框架:CXF
2.使用语言:JAVA客户端调用服务端程序,传递参数是XML格式的字符串<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<reqInfo>
    <recordInfo>
        <channelType>05</channelType>
        <createTime>20160630083759</createTime>
        <detail>测试提一个建议</detail>
        <operator>8103</operator>
        <recordSendId>JT410100201606306418</recordSendId>
        <serviceType>02</serviceType>
        <sourceArea>410100</sourceArea>
        <startDate>0</startDate>
    </recordInfo>
</reqInfo>日志打印出的SOAP报文:发现:XML中的<符合被转义成&lt;之后添加一个拦截器:日志打印出的SOAP报文:发现XML格式正常了,但是SOAP报文格式乱了。请大神指点!!

解决方案 »

  1.   

    不能使用转义,因为服务端已经规定好了,这个没法改变,要么禁止对特殊字符转义,要么增加CDATA标记,但是CDATA标记怎么添加?
      

  2.   

    你用浏览器等测试工具试试,返回的也是转义后的xml?
      

  3.   

    不是返回的,是客户端向服务端提交的报文信息,里面有我自己定义的标签,通过JAVA对象转化成XML格式的字符串,因为服务端的参数是字符串形式的,
      

  4.   

    不是返回的,是客户端向服务端提交的报文信息,里面有我自己定义的标签,通过JAVA对象转化成XML格式的字符串,因为服务端的参数是字符串形式的,
      

  5.   

    我想拼接成这样的格式,但是通过字符串拼接bodyXml ="<![CDATA["+ bodyXml+"]]";
    这样不行,会直接报错,解析格式错误之类的
    有什么办法可以直接拼接成下面的格式
      

  6.   

    bodyXml ="<![CDATA["+ bodyXml+"]]>";
    这里是不是少了“>”
      

  7.   


    webservice  接口对象中,应该有一个字符串字段,用于传递你的xml字符串服务器或客户端cxf框架,自动将字符串处理后打如soap报文,另外一端也会自动解码。你要按面向对象的方式处理接口(框架已经将soap到对象转换的工作实现了),就是直接使用接口对象,而不要用解析报文的方式处理
      

  8.   

    bodyXml ="<![CDATA["+ bodyXml+"]]>";
    这里是不是少了“>”
    这个是手误,我的意思是通过这样的字符串拼接时候<![CDATA[里面的<也被转义了,而且里面的标签<也是被转义了,没有什么用
      

  9.   

    bodyXml ="<![CDATA["+ bodyXml+"]]>";
    这里是不是少了“>”
    这个是手误,我的意思是通过这样的字符串拼接时候<![CDATA[里面的<也被转义了,而且里面的标签<也是被转义了,没有什么用
    就我的理解,webservice传递xml是完全没有问题的,不需要加CDATA什么的。
    可能存在某个配置项,控制是否将特殊字符转移,也可能只是你看到是转义的,实际上程序内部能自动处理这些字符。
      

  10.   

    bodyXml ="<![CDATA["+ bodyXml+"]]>";
    这里是不是少了“>”我通过使用拦截器增加CDATA标记public class CDATAOutInterceptor extends AbstractPhaseInterceptor<Message> { public CDATAOutInterceptor() {
    super(Phase.WRITE);
    } @Override
    public void handleMessage(Message message) throws Fault {
    message.put("disable.outputstream.optimization", Boolean.TRUE);
    XMLStreamWriter writer = StaxUtils.createXMLStreamWriter(message.getContent(OutputStream.class));
    if(writer !=null)
    {
    message.setContent(XMLStreamWriter.class, new CDATAXMLStreamWriter(writer));
    }

    }}public class CDATAXMLStreamWriter extends DelegatingXMLStreamWriter { private String currentElementName; public CDATAXMLStreamWriter(XMLStreamWriter writer) {
    super(writer);
    } @Override
    public void writeCharacters(String text) throws XMLStreamException {
    boolean useCData = isNeedCData();
    if (useCData) {
    super.writeCData(text);
    } else {
    super.writeCharacters(text);
    }
    } private boolean isNeedCData() {
    // 自己拓展哪些属性需要处理CDATA
    if(currentElementName.equals("body"))
    {
    return true;
    }else{
    return false;
    }

    } public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException {
    currentElementName = local;
    super.writeStartElement(prefix, local, uri);
    }}
    这样的方式是XML格式正常了,没有被转义了,但是SOAP报文格式乱了,SOAP HEAD BODY等位置全变了,
      

  11.   

    这样的数据,程序能正常解析吗?
    不能解析,后台程序直接就报错了,而且我用XML在线格式化,都提示格式错误,不知道该咋办了
      

  12.   

    这样的数据,程序能正常解析吗?
    不能解析,后台程序直接就报错了,而且我用XML在线格式化,都提示格式错误,不知道该咋办了
    不知道了。
      

  13.   

    楼主的路走错了,上面各位要先纠正方向,否则还是南辕北辙webservice开发流程是:使用服务端提供的wsdl,使用cxf中的wsdl2java 生成客户端对象  按cxf客户端方式调用
      

  14.   

     result = result.replaceAll("&lt;",'<'+" ");
    直接替换就可以了
      

  15.   

    我最近也是放soap 这种协议的。对我来说他只是个信封。xml是你的信的内容。你把里面的内容街取到不就能解析到了吗?你用这个试试     StringEscapeUtils.unescapeHtml(“”soap”);
      

  16.   

    楼主。我也遇到了你这个问题。但是后来我发现: 并不需要把字符转回来,转义是对的!
    因为客户端调用,需要把返回的soap报文转换为POJO对象。那么如果标签内的字符串里有特殊字符 <,>,&,是会转换失败的。因为转换器会把这些字符识别为标签 。所以在写入的时候。会自动进行转义。 比如你用SOAPUI 测,还是POSTMAN 测,都 是转义的。
    但是!!!
    当你用客户端调用的时候。xml转为POJO,这些转义字符在转换为String后会被转义回来。你可以用wsimport生成一个客户端调用试试看。
    总结来说:soap 的xml只是调用生成的一个中间部分,最后需要得到的结果其实是客户端调用接口返回的对象。