CXF拦截器输出报文,如果太大的话就不会显示出来,一片空白。

防腐基 发布于 2016/08/02 14:52
阅读 1K+
收藏 0

写法就是在网上搜到的,基本都是这么写的。

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("拦截器得到输出报文:" + xml);

一开始用着没问题,但是发现返回的报文如果太大,拦截器打印的输出报文就是空的。

如果过滤一下where条件让返回的报文变少点,发现拦截器打印的输出报文又出来了。

哪位大神知道cxf拦截器输出报文是不是有什么长度范围限制之类的- -

加载中
0
OSC_代码审查官
OSC_代码审查官
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.io.CacheAndWriteOutputStream;
import org.apache.cxf.io.CachedOutputStream;
import org.apache.cxf.io.CachedOutputStreamCallback;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.Phase;
import org.apache.log4j.Logger;

import java.io.OutputStream;

public class ArtifactOutInterceptor extends LoggingOutInterceptor {
    private static final Logger log = Logger.getLogger(ArtifactInInterceptor.class);
    private String mMessage;

    public ArtifactOutInterceptor() {
        super(Phase.PRE_STREAM);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        OutputStream out = message.getContent(OutputStream.class);
        final CacheAndWriteOutputStream newOut = new CacheAndWriteOutputStream(out);
        message.setContent(OutputStream.class, newOut);
        newOut.registerCallback(new LoggingCallback());
    }

    public class LoggingCallback implements CachedOutputStreamCallback {
        public void onFlush(CachedOutputStream cos) {

        }

        public void onClose(CachedOutputStream cos) {
            StringBuilder builder = new StringBuilder();
            try {
                cos.writeCacheTo(builder, cos.size());
            } catch (Exception e) {
                log.error(e.getMessage(), e);
            }
            mMessage = builder.toString();
            log.error("请求参数"+mMessage);
        }
    }

    /**
     * 获取信息
     *
     * @return message
     */
    public String getMessage() {
        return mMessage;
    }



OSC_代码审查官
OSC_代码审查官
回复 @蓝梦城 : 写文件
防腐基
回复 @半个朋友 : 嗯,我做的接口,返回数据给别人的。自己在soapui调试看看返回的报文是不是符合规范的。因为不符合,所以要简单修改下呢。
OSC_代码审查官
OSC_代码审查官
回复 @蓝梦城 : 出去的怎么会是返回的报文?
OSC_代码审查官
OSC_代码审查官
回复 @蓝梦城 : OutputStream out = message.getContent(OutputStream.class); message.setContent(OutputStream.class, newOut); 注意看这几行代码
防腐基
回复 @半个朋友 : 先拿到返回报文,然后修改一下命名空间前缀,在写入到流中输出出去即可。(⊙o⊙)
下一页
0
OSC_代码审查官
OSC_代码审查官
CachedOutputStream csnew = (CachedOutputStream) message.getContent(OutputStream.class);
            InputStream in = csnew.getInputStream();
            String xml = IOUtils.toString(in);
            //这里对xml做处理,处理完后同理,写回流中
            IOUtils.copy(new ByteArrayInputStream(xml.getBytes()), os);
            cs.close();
            os.flush();
            message.setContent(OutputStream.class, os);



0
防腐基

引用来自“半个朋友”的评论

CachedOutputStream csnew = (CachedOutputStream) message.getContent(OutputStream.class);
            InputStream in = csnew.getInputStream();
            String xml = IOUtils.toString(in);
            //这里对xml做处理,处理完后同理,写回流中
            IOUtils.copy(new ByteArrayInputStream(xml.getBytes()), os);
            cs.close();
            os.flush();
            message.setContent(OutputStream.class, os);



       OutputStream out = message.getContent(OutputStream.class);
       final CacheAndWriteOutputStream newOut = new CacheAndWriteOutputStream(out);
       InputStream in = newOut.getInputStream();
       String xml = IOUtils.toString(in);
       System.out.println("拦截器得到输出报文:" + xml);
       xml = replaceXML(xml);
       log.info("拦截器处理后得到输出报文:" + xml);

       IOUtils.copy(new ByteArrayInputStream(xml.getBytes("UTF-8")), newOut);

newOut.close();

       out.flush();
       message.setContent(OutputStream.class, newOut);

       newOut.registerCallback(new LoggingCallback());

---------------------------我这么加的,报文都没打印出来呢。

OSC_代码审查官
OSC_代码审查官
回复 @蓝梦城 : 加个qq吧 405300427
防腐基
回复 @半个朋友 : 这个去掉了,也没效果。这一小段代码愣是不知该如何写才有效果。悲桑~
OSC_代码审查官
OSC_代码审查官
回复 @蓝梦城 : newOut.close(); out.flush();写错了吧
防腐基
回复 @半个朋友 : 那代码是对的,可以拦截下来报文,但是我这边需要做修改再写入流中去,就这一段一直没折腾出来。唉
OSC_代码审查官
OSC_代码审查官
我第一次给你的代码就是我们项目用到的完整拦截器代码。
0
潇洒哥66666
潇洒哥66666
问下,楼主,这个问题你解决没有呢?我遇到同样的问题了,有解决方案吗?
0
宋丶岳飞
宋丶岳飞

这个我已将解决了。CachedStream cs = new CachedStream(); 有问题  换成字节数组流 完美

返回顶部
顶部