如何修改出站 CXF 请求的原始 XML 消息?

2023-12-02

我想修改传出的 SOAP 请求。 我想从信封主体中删除 2 个 xml 节点。 我设法设置了一个拦截器,并将生成的消息集的字符串值获取到端点。

但是,以下代码似乎不起作用,因为传出消息未按预期进行编辑。有没有人有一些关于如何做到这一点的代码或想法?

public class MyOutInterceptor extends AbstractSoapInterceptor {

public MyOutInterceptor() {
        super(Phase.SEND); 
}

public void handleMessage(SoapMessage message) throws Fault { 
        // Get message content for dirty editing...
        StringWriter writer = new StringWriter();
        CachedOutputStream cos  = (CachedOutputStream)message.getContent(OutputStream.class); 
        InputStream inputStream = cos.getInputStream();
        IOUtils.copy(inputStream, writer, "UTF-8");
        String content = writer.toString();

        // remove the substrings from envelope...
        content = content.replace("<idJustification>0</idJustification>", "");
        content = content.replace("<indicRdv>false</indicRdv>", "");
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        outputStream.write(content.getBytes(Charset.forName("UTF-8")));
        message.setContent(OutputStream.class, outputStream);
} 

根据第一条评论,我创建了一个抽象类,可以轻松地使用它来更改整个肥皂信封。

以防万一有人想要现成的代码部分。

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

import org.apache.commons.io.IOUtils;
import org.apache.cxf.binding.soap.interceptor.SoapPreProtocolOutInterceptor;
import org.apache.cxf.io.CachedOutputStream;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.log4j.Logger;

/**
 * http://www.mastertheboss.com/jboss-web-services/apache-cxf-interceptors
 * http://stackoverflow.com/questions/6915428/how-to-modify-the-raw-xml-message-of-an-outbound-cxf-request
 * 
 */
public abstract class MessageChangeInterceptor extends AbstractPhaseInterceptor<Message> {

    public MessageChangeInterceptor() {
        super(Phase.PRE_STREAM);
        addBefore(SoapPreProtocolOutInterceptor.class.getName());
    }

    protected abstract Logger getLogger();

    protected abstract String changeOutboundMessage(String currentEnvelope);

    protected abstract String changeInboundMessage(String currentEnvelope);

    public void handleMessage(Message message) {
        boolean isOutbound = false;
        isOutbound = message == message.getExchange().getOutMessage()
                || message == message.getExchange().getOutFaultMessage();

        if (isOutbound) {
            OutputStream os = message.getContent(OutputStream.class);

            CachedStream cs = new CachedStream();
            message.setContent(OutputStream.class, cs);

            message.getInterceptorChain().doIntercept(message);

            try {
                cs.flush();
                IOUtils.closeQuietly(cs);
                CachedOutputStream csnew = (CachedOutputStream) message.getContent(OutputStream.class);

                String currentEnvelopeMessage = IOUtils.toString(csnew.getInputStream(), "UTF-8");
                csnew.flush();
                IOUtils.closeQuietly(csnew);

                if (getLogger().isDebugEnabled()) {
                    getLogger().debug("Outbound message: " + currentEnvelopeMessage);
                }

                String res = changeOutboundMessage(currentEnvelopeMessage);
                if (res != null) {
                    if (getLogger().isDebugEnabled()) {
                        getLogger().debug("Outbound message has been changed: " + res);
                    }
                }
                res = res != null ? res : currentEnvelopeMessage;

                InputStream replaceInStream = IOUtils.toInputStream(res, "UTF-8");

                IOUtils.copy(replaceInStream, os);
                replaceInStream.close();
                IOUtils.closeQuietly(replaceInStream);

                os.flush();
                message.setContent(OutputStream.class, os);
                IOUtils.closeQuietly(os);

            } catch (IOException ioe) {
                getLogger().warn("Unable to perform change.", ioe);
                throw new RuntimeException(ioe);
            }
        } else {
            try {
                InputStream is = message.getContent(InputStream.class);
                String currentEnvelopeMessage = IOUtils.toString(is, "UTF-8");
                IOUtils.closeQuietly(is);

                if (getLogger().isDebugEnabled()) {
                    getLogger().debug("Inbound message: " + currentEnvelopeMessage);
                }

                String res = changeInboundMessage(currentEnvelopeMessage);
                if (res != null) {
                    if (getLogger().isDebugEnabled()) {
                        getLogger().debug("Inbound message has been changed: " + res);
                    }
                }
                res = res != null ? res : currentEnvelopeMessage;

                is = IOUtils.toInputStream(res, "UTF-8");
                message.setContent(InputStream.class, is);
                IOUtils.closeQuietly(is);
            } catch (IOException ioe) {
                getLogger().warn("Unable to perform change.", ioe);

                throw new RuntimeException(ioe);
            }
        }
    }

    public void handleFault(Message message) {
    }

    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 {
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何修改出站 CXF 请求的原始 XML 消息? 的相关文章

  • Hibernate注解放置问题

    我有一个我认为很简单的问题 我见过两种方式的例子 问题是 为什么我不能将注释放在字段上 让我举一个例子 Entity Table name widget public class Widget private Integer id Id G
  • 插入最大日期(独立于数据库)

    在我的本地设置中 我使用一个简单的 H2 数据库 托管 解决方案将有另一个 类似但不相同 数据库 我需要将最大可能日期插入到日期时间列中 我尝试使用 Instant MAX 但是 这会导致列中出现 169104626 12 11 20 08
  • OpenCV 中的 Gabor 内核参数

    我必须在我的应用程序中使用 Gabor 过滤器 但我不知道这个 OpenCV 方法参数值 我想对虹膜进行编码 启动 Gabor 过滤器并获取特征 我想对 12 组 Gabor 参数值执行此操作 然后我想计算 Hamming Dystans
  • 正则表达式拆分数字和字母组,不带空格

    如果我有一个像 11E12C108N 这样的字符串 它是字母组和数字组的串联 如何在中间没有分隔符空格字符的情况下分割它们 例如 我希望分割结果为 tokens 0 11 tokens 1 E tokens 2 12 tokens 3 C
  • 按第一列排序二维数组,然后按第二列排序

    int arrs 1 100 11 22 1 11 2 12 Arrays sort arrs a b gt a 0 b 0 上面的数组已排序为 1 100 1 11 2 12 11 22 我希望它们按以下方式排序a 0 b 0 首先 如果
  • 画透明圆,外面填充

    我有一个地图视图 我想在其上画一个圆圈以聚焦于给定区域 但我希望圆圈倒转 也就是说 圆的内部不是被填充 而是透明的 其他所有部分都被填充 请参阅这张图片了解我的意思 http i imgur com zxIMZ png 上半部分显示了我可以
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • Java 中的“Lambdifying”scala 函数

    使用Java和Apache Spark 已用Scala重写 面对旧的API方法 org apache spark rdd JdbcRDD构造函数 其参数为 AbstractFunction1 abstract class AbstractF
  • react-native run-android 失败并出现错误:任务 ':app:dexDebug' 执行失败

    我使用的是 Windows 8 1 和react native cli 1 0 0 and react native 0 31 0 添加后react native maps对于该项目 我运行了命令react native upgrade并给
  • 编辑文件名在 JComboBox 中的显示方式,同时保持对文件的访问

    我对 Java 很陌生 对堆栈溢出也很陌生 我正在尝试利用 JMF API 创建一个用 Java 编码的简单媒体播放器 到目前为止 我已经能够设置一个简单的队列 播放列表来使用JComboBox called playListHolder
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • 欧洲中部时间 14 日 3 月 30 日星期五 00:00:00 至 日/月/年

    我尝试解析格式日期Fri Mar 30 00 00 00 CET 14至 日 月 年 这是我的代码 SimpleDateFormat formatter new SimpleDateFormat dd MM yyyy System out
  • Jersey 客户端请求中未设置 Content-Length-Header

    我正在使用 Jersey Client 访问网络服务 如下所示 response r accept MediaType TEXT PLAIN TYPE header content length 0 post String class 其中
  • 如何知道抛出了哪个异常

    我正在对我们的代码库进行审查 有很多这样的陈述 try doSomething catch Exception e 但我想要一种方法来知道 doSomething 抛出了哪个异常 在 doSomething 的实现中没有 throw 语句
  • 在 Spring 中重构这个的最佳方法?

    private final ExecutorService executorParsers Executors newFixedThreadPool 10 public void parse List
  • 测试弱引用

    在 Java 中测试弱引用的正确方法是什么 我最初的想法是执行以下操作 public class WeakReferenceTest public class Target private String value public Targe
  • HQL Hibernate 内连接

    我怎样才能在 Hibernate 中编写这个 SQL 查询 我想使用 Hibernate 来创建查询 而不是创建数据库 SELECT FROM Employee e INNER JOIN Team t ON e Id team t Id t
  • Java中的Object类是什么?

    什么是或什么类型private Object obj Object http download oracle com javase 6 docs api java lang Object html是Java继承层次结构中每个类的最终祖先 从
  • Trie 数据结构 - Java [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有任何库或文档 链接提供了在 java 中实现 Trie 数据结构的更多信息 任何帮助都会很棒 Thanks 你可以阅读Java特里树
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话

随机推荐

  • android webview 导致空指针

    我的布局中有这个
  • Qt 创建者错误

    启动项目调试 然后 Running build steps for project Text Editor Starting c qt 2010 05 qt bin qmake exe C Qt 2010 05 Text Editor Te
  • iOS 8.3 中的 UIDatePicker 内存泄漏

    当在运行 IOS 8 3 的 iPad 上的弹出窗口中使用 UIDatePicker 时 我发现内存泄漏 每次弹出日期选择器然后关闭时 我都会在多次内存泄漏中得到大约 5K 的信息 泄漏的对象是 NSDateComponents 负责的框架
  • Boost:反序列化通过 ZeroMQ 拉套接字传递的自定义 C++ 对象

    我在这里写的文字是我之前在另一个线程中打开的后续问题Boost 序列化 反序列化通过 ZeroMQ 拉套接字传递的自定义 C 对象 早期线程中的编译问题已通过使用文本存档类型而不是二进制存档解决 但现在我在反序列化时遇到运行时问题 为了您的
  • 以字符串形式接收数字(uart)

    我正在尝试通过 uart 接收一个包装为字符串的数字 我发送数字 1000 所以我得到 4 个字节 空字符 但是 当我使用 atoi 将数组转换为数字并将整数与 1000 进行比较时 我并不总是得到正确的数字 这是我用于接收号码的中断处理函
  • 如何在打字稿中使用 jquery ui 和 commonjs

    为了获得更多上下文 我决定将所有模块保留为 commonjs 格式以实现可移植性 并使用 browserify 和其他一些东西来捆绑前端的东西 我使用 TypeScript 进行类型检查 但我不确定如何在我的配置中使用 jquery ui
  • 如何创建随机 3D 矩阵?

    有没有办法随机创建 3D 矩阵 有多种方法可以使用以下方法创建随机二维矩阵randint功能 有没有类似的内置功能 例如 使用以下命令可以轻松生成 4x4 矩阵randint功能 如果我想创建一个 4x4x3 维度的矩阵怎么办 您可以使用r
  • Struts逻辑:迭代输入字段

    我目前有以下代码 数据显示良好
  • PHP strtotime 对于小于 1900 的日期返回 false

    我知道这个问题很受欢迎 在这里问PHP strtotime 对于未来的日期返回 false 和这里如何在 PHP 中处理 1900 年之前的日期 您能否确认我的选择 升级到64位架构 将 strtotime 调用替换为 DateTime D
  • 如何在WinForms系统菜单中显示带有图标和文本的菜单项

    在调整的同时answer of ygoe 我发现可以向菜单添加图标 我尝试并成功地通过将此代码用于纯文本项目来做到这一点 var item new MenuItemInfo cbSize uint Marshal SizeOf typeof
  • HTML textarea:使用 JavaScript 获取换行文本?

    如果我有一个像这样的文本区域
  • 只读取txt文件中给定的最后x行[重复]

    这个问题在这里已经有答案了 目前我正在使用 File ReadAllText 读取文件内容 但现在我需要读取 txt 文件中的最后 x 行 我怎样才能做到这一点 内容myfile txt line1content line2content
  • 如何在 tensorflow.js 模型中添加图像并针对给定图像标签训练模型

    我们使用 TensorFlow js 来创建和训练模型 我们使用 tf fromPixels 函数将图像转换为张量 我们想要创建一个具有以下属性的自定义模型 AddImage HTML Image Element Label 添加带有自定义
  • JqG​​rid addJSONData + ASP.NET 2.0 WS

    我有点失落 我尝试实现一个基于 JqGrid 的解决方案 并尝试使用函数作为数据类型 我猜我已经按照书本设置了所有内容 我调用了 WS 并返回了 JSON 我在 ajax 调用中在客户端取得了成功 并且我使用 绑定 jqGridaddJSO
  • 发送 AJAX 结果但继续在 PHP 中处理

    我正在使用 AJAX 更新数据库中的一些值 一切都工作得很好 但现在我想实现一些日志记录的东西 日志记录功能看起来需要花费相当多的处理时间 并且用户没有理由必须等待它们完成才能看到 AJAX 结果 因此 我正在尝试找到一种方法来发送 AJA
  • 如何在Java中读取同一行的多个输入?

    因此 我尝试使用扫描仪读取一行中的所有输入 然后获取值并找到第二大值 我会使用一个数组BUT我不被允许 您应该输入 10 个整数 按 Enter 键并计算它们 像这样的事情 10 20 30 40 50 60 70 80 90 100 EN
  • 在 C 程序中使用 _ 和 __ [重复]

    这个问题在这里已经有答案了 我正在读K R的书 我读 仅供标准库函数使用的名称 首先 所以它们不太可能与中的名称发生冲突 用户程序 这到底是什么意思 请解释一下真正简单实用的方法 我的理解是 如果我想使用 math h 中定义的 sqrt
  • 无法从根提供程序 .Net Core 2 解析范围服务

    当我尝试运行我的应用程序时 出现错误 InvalidOperationException Cannot resolve API Domain Data Repositories IEmailRepository from root prov
  • Slick:具有左连接的查询中的动态排序

    这是一个源自于的问题另一个问题 我需要能够动态传递要在具有左连接的 Slick 查询中排序的列 在这种特殊情况下的问题是左连接表变得可选 我不知道如何处理它 如果我做桌子Company不是可选的我得到SlickException Read
  • 如何修改出站 CXF 请求的原始 XML 消息?

    我想修改传出的 SOAP 请求 我想从信封主体中删除 2 个 xml 节点 我设法设置了一个拦截器 并将生成的消息集的字符串值获取到端点 但是 以下代码似乎不起作用 因为传出消息未按预期进行编辑 有没有人有一些关于如何做到这一点的代码或想法