在 Camel-CXF 中将自定义 Soap-Header 设置为 pojo-message

2024-03-23

我的 CXF 肥皂头有问题。我使用合同优先开发方法建立了一个 cxf 项目。我想使用 cxf 组件调用 Web 服务,如下所示。

<cxf:cxfEndpoint id="ICCSCustomerService" 
                 address="http://localhost:8080/iccs-xsoap/CustomerService/updateCustomer"
                 serviceClass="de.iccs.xsoap.customer.v1.CustomerServiceImpl" >
</cxf:cxfEndpoint>

我想发送一条 pojo 消息抛出一个直接组件作为对 ws.我的路线如下:

<route id="CustomerServiceUpdateCustomerTest">
        <camel:from uri="direct:iccsUpdateCustomerRequest"/>
        <camel:process ref="addCredentials"/>
        <to uri="cxf:bean:ICCSCustomerService"/>  
        <camel:to uri="stream:out"/>
</route>

我需要实现一个像这样的肥皂头:

<ns2:Header>
    <simpleAuth xmlns="http://xsoap.iccs.de/v1" password="abc" username="xxx"/>
</ns2:Header>

为了存档这个,我编写了一个像这样的处理器(另请参阅示例http://camel.apache.org/cxf.html http://camel.apache.org/cxf.html):

@Override 
public void process(Exchange exchange) throws Exception { 
   List<SoapHeader> soapHeaders = CastUtils.cast((List<?)exchange.getOut().getHeader(Header.HEADER_LIST)); 
    // Insert a new header 
    String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><outofbandHeader " 
        + "xmlns=\"http://cxf.apache.org/outofband/Header\" hdrAttribute=\"testHdrAttribute\" " 
        + "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" soap:mustUnderstand=\"1\">" 
        + "<name>simpleAuth username=\"xxx\" password=\"abc\" xmlns=\"http://xsoap.iccs.de/v1\"</name></outofbandHeader>"; 

    SoapHeader newHeader = new SoapHeader(new QName("http://xsoap.iccs.de/v1", "simpleAuth"), 
                   DOMUtils.readXml(new StringReader(xml)).getDocumentElement()); 
    // make sure direction is OUT since it is a response message. 
    newHeader.setDirection(Direction.DIRECTION_OUT); 
    //newHeader.setMustUnderstand(false); 
    soapHeaders.add(newHeader); 
}

不幸的是,我在这个语句中遇到了空指针异常: 列表soapHeaders = CastUtils.cast((列表

显然,此消息中没有肥皂头。而且这似乎根本不是一条肥皂剧信息。 像这样编组

       <camel:marshal>
            <soapjaxb contextPath="de.iccs.xsoap.customer.v1" />
        </camel:marshal>
        <camel:process ref="addCredentials"/>

不起作用,因为它只产生一个没有肥皂头的肥皂信封。 (当然,这不起作用,因为 cxf-endpoint 在 pogo 模式下工作) 您能给我提供一个如何从 pojo 消息设置肥皂消息(带有肥皂头)的示例吗?

谢谢 加布里埃尔


不知道你是否已经解决了你的问题,但我也经历过类似的事情,所以也许有人会受益。

如果您的 NPE 是由于不存在现有标头而导致的,那么如果需要,创建一个新列表是完全可以接受的。

if (message.getHeader(Header.HEADER_LIST) == null) {
    message.setHeader(Header.HEADER_LIST, new ArrayList<SoapHeader>());
}

但是,使用手工制作的 XML 来填充 SoapHeader 时,您可能会遇到另一个问题。您仍在使用原始 CXF 示例中的 outofbandHeader 元素;这是示例中的特定标头,not带外标头的通用包装器。另外,您的 simpleAuth 未标记为元素(尽管很难阅读......)。

如果您的 simpleAuth 元素使用 @XMLRootElement 注释了类(生成或创建),则可以使用采用 JAXBDataBinding 的 SoapHeader 构造函数。 CXF 将为您整理标头。

@Override 
public void process(Exchange exchange) throws Exception {

    Message in = exchange.getIn();
    if (in.getHeader(Header.HEADER_LIST) == null) {
        in.setHeader(Header.HEADER_LIST, new ArrayList<SoapHeader>());
    }
    List<SoapHeader> headers = CastUtils.cast((List<?>)in.getHeader(Header.HEADER_LIST));

    SimpleAuth auth = new SimpleAuth();
    auth.setUsername("xxx");
    auth.setPassword("abc");

    try {
        SoapHeader header = new SoapHeader(new QName("http://xsoap.iccs.de/v1", "simpleAuth"),
                auth, new JAXBDataBinding(SimpleAuth.class));
        header.setDirection(Direction.DIRECTION_OUT);
        header.setMustUnderstand(true);
        soapHeaders.add(header);            
    } catch (JAXBException e) {
    e.printStackTrace();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Camel-CXF 中将自定义 Soap-Header 设置为 pojo-message 的相关文章

随机推荐

  • 枚举作为 TypeScript 中的参数

    是否可以将参数的类型设置为 Enum 像这样 private getRandomElementOfEnum e enum string var length number Object keys e length return e Math
  • 添加适用于 Firefox Webdriver 但不适用于 PhantomJS 的 Cookie

    我有一个带有饼干的泡菜 是通过以下命令创建的 def doLogin driver do login stuff pickle dump driver get cookies open cookies pkl wb 我有获取 cookie
  • 渲染新行的 HTML 规范?

    我正在尝试将一些简单的 HTML 文档 主要包含 div 和 br 标签 呈现为纯文本 但我在何时添加新行方面遇到了困难 我以为这会很简单 div and br 生成新的线条 但看起来有各种微妙的规则 例如 div one line div
  • 如何将两组 weka 实例合并在一起

    目前 我一次将一个实例从一个数据集复制到另一个数据集 有没有办法做到这一点 使字符串映射保持完整 mergeInstances 水平工作 是否有等效的垂直合并 这是我用来将多个 arff 文件中相同结构的数据集读取到一个大型数据集中的循环的
  • 如何在JPA中定义单向OneToMany关系

    我在 JPA 中的实体映射方面遇到以下问题 我有两个实体 第一个是查找 第二个是代表实体翻译的文本 现在我需要将 Lookup 绑定到 Text 但我不希望 Text 引用 Lookup 为了使事情变得更复杂 文本在这种关系中不使用其主键
  • 将行添加到命名范围

    我在 Google 表格中有一个命名范围 A1 K14 我想做的就是在命名范围的底部添加一个新行 这似乎是一项容易的任务 使用此代码不会扩展命名范围 并且我没有收到错误消息 它确实在命名范围之外插入一个新行 这不是我想要做的 如果我改为in
  • 带有单位编号/子前提的 Google 地方自动完成建议不会出现在响应数组中

    我正在使用 Google Places API 使用 javascript 自动完成地址 当我在输入框中输入地址的单元号和街道号时 它会在建议下拉列表中显示结果 但是当我选择地址时 操作 place changed 事件的侦听器没有任何地址
  • Rails:如何向包含变音符号的收件人发送电子邮件?

    我想发送一封包含以下设置的电子邮件 def registration confirmation user recipients user username lt user email gt from Netzwerk Muensterlan
  • 内连接与何处连接

    两者之间的性能 在 Oracle 中 是否存在差异 Select from Table1 T1 Inner Join Table2 T2 On T1 ID T2 ID And Select from Table1 T1 Table2 T2
  • Hive“ANALYZE TABLE”如何从java执行

    我需要计算配置单元表中的行数 为此 我正在使用查询 ANALYZE TABLE p 7 COMPUTE STATISTICS noscan 我想通过java获取结果 我正在尝试以下操作 代码并没有运气 我得到的错误是 Exception i
  • 如何跳转到一个巨大的文本文件中的特定行?

    下面的代码是否有其他替代方案 startFromLine 141978 or whatever line I need to jump to urlsfile open filename rb 0 linesCounter 1 for li
  • 将键值对文件读入 std::map

    我有一个 Visual Studio 2008 C 03 项目 我想将键值对文件读取到 std map 中 为此 我创建了一个istreambuf pair iterator如下 typedef std map lt std string
  • 求解四变量线性方程

    问题 我需要用 Python 解这些方程 a 3b 2c 2d 1 2a b c 2d 0 3a b 2c d 1 2a c 3d 0 这样我就可以得到a b c和d的值 有没有办法可以用分数来显示它们 My code import num
  • 如何使用版本 Maven 插件更新依赖同级模块的版本

    我在更新依赖同级项目的依赖版本时遇到问题 我的简化项目设置如下 root parent tool core tool functional tests 父项目拥有所有全局属性和依赖管理 功能测试取决于工具 而工具又取决于工具核心 根pom
  • ImageView - 高度与宽度匹配吗?

    我有一个图像视图 我希望它的宽度为 fill parent 我希望它的高度是最终的宽度 例如
  • 来自相机的原始图像数据,如“645 PRO”

    不久前我已经问过这个问题并且我也得到了很好的答案 我一直在这个论坛上上下搜索 但找不到我想要的东西 真的需要 我想从相机获取原始图像数据 至目前为止 我试图从中获取 imageDataSampleBuffer 中的数据 方法 capture
  • 如何编写HQL插入查询?

    我正在努力编写一个 HQL 查询来在表中插入新记录 我已经看到了一些插入查询 如下所示 但我不想从另一个表插入数据 如下代码所示 String hql INSERT INTO Employee firstName lastName sala
  • 局部变量赋值以避免多次强制转换

    最近有一个问题询问在 Java 中将调用 getter 的结果分配给局部变量以避免多次调用同一访问器是否是一个好主意 我找不到原始帖子 但共识似乎是这通常是不必要的 因为 Hotspot 无论如何都会优化方法调用开销 然而 对于采用这种技术
  • 执行 PHP 切换每个案例多个值的最佳方法?

    你会如何执行这个 PHP switch 语句 另请注意 这些版本要小得多 我需要创建的版本将添加更多的值 版本1 switch p case home case current home current break case users o
  • 在 Camel-CXF 中将自定义 Soap-Header 设置为 pojo-message

    我的 CXF 肥皂头有问题 我使用合同优先开发方法建立了一个 cxf 项目 我想使用 cxf 组件调用 Web 服务 如下所示