我开始使用si-xml:xpath-router但我遇到了障碍。我使用正确的路由器但执行错误吗?如果我使用的是错误的路由器,我应该使用哪一个,即默认路由器,有效负载类型,或者可能是一个简单的SpEL表达式?
使用案例
我需要根据有效负载内容路由消息。该请求包含一个元素,我需要执行的“操作”包含在其中一个属性中,请参阅下面的属性“command”。
示例入站请求(来自Web服务)。
<Request>
<Records>
<Record>
<data key="name" value="Jack Bauer" />
<data key="command" value="sendSMS" />
</Record>
</Records>
</Request>
伪造的代码是:
但是我收到了错误:
不支持的有效内容类型[javax.xml.transform.dom.DOMResult]
为了解决这个问题,我尝试过:
使用ResultToDocumentTransformer将属性“result-transformer”添加到变换器bean。 错误 =无法解析频道名称''
使用StringResult将属性“result-type”添加到变换器。 错误 =不支持的有效内容类型[org.springframework.xml.transform.StringResult]
添加以上两者。 错误 =无法解析频道名称''
使用true添加属性“evaluate-as-string”。 错误 =不支持的有效内容类型。
以下原始配置文件:
<gateway id="gateway" default-request-channel="requestChannel"
service-interface="foo.SomeClass" />
<beans:bean id="marshaller"
class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<beans:property name="classesToBeBound">
<beans:list>
<beans:value>com.foo.Request</beans:value>
<beans:value>com.foo.Record</beans:value>
<beans:value>com.foo.Data</beans:value>
</beans:list>
</beans:property>
</beans:bean>
<chain input-channel="requestChannel">
<poller max-messages-per-poll="10" task-executor="executor">
<interval-trigger interval="5000" />
</poller>
<si-xml:marshalling-transformer marshaller="marshaller"/>
<si-xml:xpath-router id="instockRouter" resolution-required="true">
<si-xml:xpath-expression expression="/Request/Records/Record/data[@key='command']"/>
<si-xml:mapping value="sendSMS" channel="SMSChannel"/>
</si-xml:xpath-router>
</chain>
<task:executor id="executor" pool-size="8"/>
答案 0 :(得分:2)
您可以在编组后使用Spring的"=object-to-string-transformer />"
。
答案 1 :(得分:0)
从我所看到的:
org.springframework.oxm.jaxb.Jaxb2Marshaller
将对象编组到javax.xml.transform.dom.DOMResult
DOMResult
类型时,您尝试使用xpath-router。据我所知,如果消息有效内容是包含普通XML的String类型,XPath路由器可以正常工作。所以我建议在使用xpath路由器之前不要编写你的消息,而是首先使用xpath路由器。
如果你要编组该对象,它将是DOMResult
类型,你将不得不处理DOMResult
(悲伤但是真实的:))
...无论如何我认为DOMResult不是你想要的消息有效载荷 - 也许你在编组和解组之间犯了错误?