java通过cxf实现webservice服务端,客户端接收不到响应信息处理方法

最近在做项目时与客户进行webservice联调,响应成功后返回1,服务端正常返回,客户端表示没有收到,针对其中的问题分析和处理方法。

1.判断是否是服务写的有问题,写了个测试方式试了下,发现服务端返回没有问题

String xmlStr = "****";
String WS_URL = "http://192.168.0.120:9011/******/webService/UserService?wsdl";
JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();
Client client = clientFactory.createClient(WS_URL);
Object[] result = client.invoke("syncUserInfo", xmlStr);
System.out.println(result[0]);

java通过cxf实现webservice服务端,客户端接收不到响应信息处理方法_第1张图片

2.由于客户端不是用java实现的,所以判断科室是报文格式问题,于是问客户要了响应报文,通过工具测试了下。下载地址

以下是报文对比:

服务端返回报文




 1
 

 

 

客户提供报文:

java通过cxf实现webservice服务端,客户端接收不到响应信息处理方法_第2张图片

将响应报文进行修改

修改spring.xml

 


   
      
   
   
      
   

parseInterceptor.java

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.io.CachedOutputStream;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * 将返回报文改为客户能解析的格式
 */
public class ParseInterceptorextends AbstractPhaseInterceptor {

    public ParseInterceptor() {
        super(Phase.PREPARE_SEND);//准备调用前调用
    }

    public void handleMessage(SoapMessage message) {
        try {

            OutputStream os = message.getContent(OutputStream.class);

            CachedStream cs = new CachedStream();

            message.setContent(OutputStream.class, cs);

            message.getInterceptorChain().doIntercept(message);

            CachedOutputStream csnew = (CachedOutputStream) message.getContent(OutputStream.class);
            InputStream in = csnew.getInputStream();

            String xml = IOUtils.toString(in);
            System.out.println("replaceBegin"+xml);

            xml=xml.replace("soap:", "S:")
                    .replace(":soap", ":S")
                    .replace("ns1", "ns2");
            System.out.println("replaceAfter"+xml);
            //这里对xml做处理,处理完后同理,写回流中
            IOUtils.copy(new ByteArrayInputStream(xml.getBytes("UTF-8")), os);

            os.flush();
            message.setContent(OutputStream.class, os);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private class CachedStream extends CachedOutputStream {

        public CachedStream() {

            super();

        }

        protected void doFlush() throws IOException {

            currentStream.flush();

        }

        protected void doClose() throws IOException {

        }

        protected void onWrite() throws IOException {

        }

    }

}

重新使用工具测试

java通过cxf实现webservice服务端,客户端接收不到响应信息处理方法_第3张图片

重新联调测试,响应成功,搞定。

你可能感兴趣的:(java)