Oracle服务总线-分配表达式
我有这个问题,我不知道为什么会发生,如何解决它。我已经创建了一个OSB项目。在代理服务管道中,我正在对另一个应用程序中的同步SOAP服务进行服务调用。其他服务需要请求主体,如下所示:Oracle服务总线-分配表达式,oracle,xslt,transform,soa,osb,Oracle,Xslt,Transform,Soa,Osb,我有这个问题,我不知道为什么会发生,如何解决它。我已经创建了一个OSB项目。在代理服务管道中,我正在对另一个应用程序中的同步SOAP服务进行服务调用。其他服务需要请求主体,如下所示: <RequestSelectionValues xmlns="http://www.camstar.com/WebService/WSShopFloor"> <inputServiceData xmlns:q1="http://www.camstar.com/WebSe
<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>
按FabLotNumber计算的xLot
FabLotNumber
工厂地块1
200行的区块
1.
1000
1.
用户
0
假的
假的
假的
假的
假的
真的
我使用赋值将上述表达式放入变量中
注意这一行:
<serviceInfo xmlns:q3="http://www.camstar.com/WebService/DataTypes" q3:type="OnlineQuery_Info">
xmlns:q3=”http://www.camstar.com/WebService/DataTypes“需要在q3之前:type=“OnlineQuery\u Info”才能成功调用其他服务,否则服务调用将失败
在开发过程中,它看起来不错。我也可以测试表达式的赋值
当我转到OSB控制台测试该服务时,我注意到在Assign变量中,名称空间place发生了切换,如下所示:
<serviceInfo q3:type="OnlineQuery_Info" xmlns:q3="http://www.camstar.com/WebService/DataTypes">
这使得服务调用失败。我已经尝试将主体负载放入xslt中。结果是一样的。我不知道为什么它会在名称空间之前切换类型。最终结果是服务没有按预期工作
你知道我能做些什么来解决这个问题吗。如何防止切换
谢谢我在OSB中找不到任何可以阻止为您重新排序属性的设置。但是,上述OSB行为完全符合XML标准。事实上,目标服务端应该是XML兼容的,并将上面提到的两个变体视为相同的,因为根据XML标准,只有属性顺序不同的两个XML文档应该被视为相同的 编辑: 请转到下载修改后的配置。我的想法是:
我能想到的一个解决方案是在父标记级别分配所有名称空间,并将属性保留在适用的位置 例如:
<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">
但是这个实现的问题是,由于名称空间声明现在是全局的,所以必须向先前定义名称空间的块声明名称空间前缀(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标准,标记将采用“default”名称空间值,这将是父级的名称空间
但是,即使此解决方案有一个循环的实现方式,此解决方案肯定会起作用。我同意您的意见,但目标服务不接受这两个变体。不可能在该应用程序中更改任何内容。它安装在室内,但没有任何定制。无法更改Web服务。如果这是OSB的正常行为,那么我恐怕被卡住了,无法继续:(我尝试在OSB外部使用XSLT,但效果与预期一样,属性不会切换,但一旦在OSB中使用XSLT,其切换和服务调用就会失败。如果使用XML,则无法保证属性排序和名称空间前缀等功能。如果目标服务真的以这种方式工作,我建议您尝试在ext’模式而不是XML。更准确地说,我认为您可以尝试将XML作为响应,而将文本作为请求,OSB在处理您的请求消息时没有XML的概念,因此不会更改您的请求消息中的任何内容。如果您和您的团队觉得这有点奇怪,您可以将此“奇怪”逻辑放在单独的代理/业务服务中,以便整体解决方案看起来更干净。您认为呢?您好,它甚至不能与文本一起工作。一旦我将请求分配给变量,它就会切换属性。这个问题确实困扰着我。我已经联系了Oracle支持部门,但到目前为止还没有解决方案。如果我听到任何反馈,我会通知您。