Oracle Service Bus - 分配表达式

时间:2013-10-24 08:43:01

标签: oracle xslt transform soa osb

我有这个问题,我不确定为什么会这样,以及如何解决它。我创建了一个OSB项目。在代理服务管道中,我正在为另一个应用程序中的同步SOAP服务执行服务调用。其他服务需要请求正文如下:

  <RequestSelectionValues xmlns="http://www.camstar.com/WebService/WSShopFloor">
            <inputServiceData xmlns:q1="http://www.camstar.com/WebService/DataTypes" q1:type="OnlineQuery">
                <OnlineQuerySetup>
                    <__CDOTypeName/>
                    <__name>xLot By FabLotNumber</__name>
                </OnlineQuerySetup>
                <Parameters>
                    <__listItem>
                        <Name>FabLotNumber</Name>
                        <DefaultValue>FAB_Lot_1</DefaultValue>
                    </__listItem>
                    <__listItem>
                        <Name>BLOCKOF200ROWS</Name>
                        <DefaultValue>1</DefaultValue>
                    </__listItem>
                </Parameters>
            </inputServiceData>
   <queryOption xmlns:q2="http://www.camstar.com/WebService/DataTypes" q2:type="QueryOption">
    <RowSetSize>1000</RowSetSize>
    <StartRow>1</StartRow>
    <QueryType>user</QueryType>
    <ChangeCount>0</ChangeCount>
    <RequestRecordCount>false</RequestRecordCount>
    <RequestRecordSetAndCount>false</RequestRecordSetAndCount>
   </queryOption>
            <serviceInfo xmlns:q3="http://www.camstar.com/WebService/DataTypes" q3:type="OnlineQuery_Info">
                <OnlineQuerySelection>
                    <RequestValue>false</RequestValue>
                    <RequestMetadata>false</RequestMetadata>
                    <RequestSubFieldValues>false</RequestSubFieldValues>
                    <RequestSelectionValues>true</RequestSelectionValues>
                </OnlineQuerySelection>
            </serviceInfo>
  </RequestSelectionValues>

我使用Assign将上面的表达式放在变量中。

注意这一行:

<serviceInfo xmlns:q3="http://www.camstar.com/WebService/DataTypes" q3:type="OnlineQuery_Info">

xmlns:q3 =“http://www.camstar.com/WebService/DataTypes”需要在q3之前:type =“OnlineQuery_Info”,以便成功调用其他服务,否则服务调用将失败。

在开发中它看起来很好。我也可以测试表达式的分配。

当我去OSB控制台测试服务时,我注意到在Assign变量中,命名空间位置切换,它变成这样:

<serviceInfo q3:type="OnlineQuery_Info" xmlns:q3="http://www.camstar.com/WebService/DataTypes">

这使服务调用失败。我已经尝试将身体有效负载放在xslt中。结果是一样的。我不确定为什么它在命名空间之前切换类型。最终结果是服务没有按预期工作。

知道我可以做些什么来解决这个问题。如何防止切换?

由于

2 个答案:

答案 0 :(得分:0)

我没有在OSB中找到任何可以阻止为您重新排序属性的设置。但是,上述OSB行为完全符合XML标准。实际上,目标服务端应该是XML兼容的,并且将上面提到的两个变体视为相同,因为根据XML标准,只有属性排序差异的两个XML文档应该被视为相同。

编辑: 请转here下载修改后的配置。我的想法是:

  1. 在“Text as Request”模式中指定要调用的业务服务,如下所示为“CamstarLotQuery / business / CSWSShopFloor_Txt”: enter image description here
  2. 按照“CamstarLotQuery / proxy / CamstarLotQueryTxt_Txt”中的说明,在代理服务中以文本而不是XML的形式处理邮件:
  3. 您可能需要在调用业务服务时在http标头中指定SOAP操作,具体取决于目标服务。

答案 1 :(得分:0)

我能想到的一个解决方案是在父标签级别分配所有名称空间,并将属性保留在适用的位置。

示例:

<RequestSelectionValues xmlns:q1="http://www.camstar.com/WebService/DataTypes" xmlns="http://www.camstar.com/WebService/WSShopFloor" xmlns:q2="http://www.camstar.com/WebService/DataTypes" xmlns:q3="http://www.camstar.com/WebService/DataTypes">

但是这个实现的问题在于,由于名称空间声明现在是Global,因此必须将名称空间前缀(q1,q2,q3)声明为先前定义名称空间的块。

示例:

<q3:serviceInfo q3:type="OnlineQuery_Info">
   <q3:OnlineQuerySelection>
      <q3:RequestValue>false</q3:RequestValue>
      <q3:RequestMetadata>false</q3:RequestMetadata>
      <q3:RequestSubFieldValues>false</q3:RequestSubFieldValues>
      <q3:RequestSelectionValues>true</q3:RequestSelectionValues>
   </q3:OnlineQuerySelection>
</q3:serviceInfo>

如果未声明此命名空间前缀,则根据XML标准,标记将采用“默认”命名空间值 - 这将是父级的命名空间。

然而,即使这个解决方案有一个全面的实现方式,这个解决方案肯定会有效。