以下是我创建的示例服务,以突出显示我在项目中遇到的问题(请求和响应非常大,此问题在许多地方重复)。
要求: { “id”:“3”, “部分”:[“屏幕”] }
实际回应: { “id”:“3”, “部分”:“屏幕”, “make”:“Tamsung” }
期望回应:
{ “id”:“3”, “部分”:[“屏幕”], “make”:“Tamsung” }
问题:
“parts”:“屏幕”,
应该如下所示
“parts”:[“Screen”],
即。它不再是数组了。我知道数组只包含一个元素。但是将此服务的输出作为输入(请求)发送到的第三方系统期望该元素为数组。所以我需要它作为数组。
arrayTest.xml:
<enrich>
<source clone="true" type="inline">
<make xmlns="">Tamsung</make>
</source>
<target action="child" xpath="//jsonObject"/>
</enrich>
<enrich>
<source clone="true" xpath="//jsonObject"/>
<target type="body"/>
</enrich>
<respond/>
</inSequence>
<outSequence/>
<faultSequence/>
</resource>
我想,我无法使用payloadFactory重新创建消息,因为, “我正在使用rich mediator修改的消息(有效负载)是”来自第三方服务的巨大而动态的响应“。这个响应我需要在我的服务中的许多地方修改/丰富,并将其作为输入发送给另一个第三方服务。
使用“动态”我的意思是,每次服务收到请求时,消息中的某些内容都是不同的(更改),具体取决于第三方服务收到的请求中的某些因素,该服务将消息作为此服务的输入。
所以我想我不能像这样使用payloadFactory重新创建消息
<payloadFactory media-type="json">
<format>{"id" : $1, "parts" : $2, "make" : "Tamsung"}</format>
<args>
<arg evaluator="json" expression="$.id"></arg>
<arg evaluator="json" expression="$.parts"></arg>
</args>
</payloadFactory>
因为它将来自第三方服务的动态响应。所以我们不能在payloadFactory中重新创建它不是静态的消息。
答案 0 :(得分:0)
使用以下参数在转换发生时保留JSON有效负载中的单个元素数组。
synapse.json.to.xml.processing.instruction.enabled=true
需要在/conf/synapse.properties中添加参数才能实现此功能。最后,重新启动服务器,您将能够解决上述问题。