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

发布于 2021-12-02 09:32:37 字数 613 浏览 897 评论 13

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

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拦截器输出报文是不是有什么长度范围限制之类的- -

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(13

高跟鞋的旋律 2021-12-08 19:45:54

楼主我也遇到这个问题了,换成字节数组流还是不行,请问你是怎么处理的啊,急……

醉生梦死 2021-12-08 19:45:53

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

坚持沉默 2021-12-08 19:45:43

问下,楼主,这个问题你解决没有呢?我遇到同样的问题了,有解决方案吗?

甜柠檬 2021-12-08 19:45:12

回复
那代码是对的,可以拦截下来报文,但是我这边需要做修改再写入流中去,就这一段一直没折腾出来。唉

噩梦成真你也成魔 2021-12-08 19:42:20

回复
newOut.close(); out.flush();写错了吧

岁月打碎记忆 2021-12-08 19:37:16

回复
这个去掉了,也没效果。这一小段代码愣是不知该如何写才有效果。悲桑~

情栀口红 2021-12-08 19:36:48
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);

奢华的一滴泪 2021-12-08 19:34:32

回复
先拿到返回报文,然后修改一下命名空间前缀,在写入到流中输出出去即可。(⊙o⊙)

海之角 2021-12-08 19:11:18

回复
OutputStream out = message.getContent(OutputStream.class); message.setContent(OutputStream.class, newOut); 注意看这几行代码

岁月打碎记忆 2021-12-08 18:07:57

回复
出去的怎么会是返回的报文?

尐偏执 2021-12-08 08:50:57

回复
嗯,我做的接口,返回数据给别人的。自己在soapui调试看看返回的报文是不是符合规范的。因为不符合,所以要简单修改下呢。

浮生未歇 2021-12-07 15:45:03

回复
写文件

情场扛把子 2021-12-07 15:37:32
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;
    }

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文