2011-08-03 86 views
0

我開始使用si-xml:xpath-router,但遇到了障礙。我使用正確的路由器但錯誤的實施?如果我使用不正確的路由器,我應該使用哪一個路由器,即默認路由器,有效載荷類型,還是簡單的SpEL表達式?如何使用Spring Integration 2.0.5基於內容路由消息?

使用案例:

我需要基於路由的負載內容的消息。請求包含一個元素,我需要執行的'action'包含在其中一個屬性中,請參閱下面的屬性「命令」

示例入站請求(來自Web服務)。

<Request> 
    <Records> 
    <Record> 
     <data key="name" value="Jack Bauer" /> 
     <data key="command" value="sendSMS" /> 
    </Record> 
    </Records> 
</Request> 

的僞碼是:

  • 馬歇爾消息。基於值
  • 路線,通過XPath的路由器

但我發現了錯誤:

不受支持的有效載荷類型[javax.xml.transform.dom.DOMResult中]


爲了解決這個問題,我曾嘗試:

  • 使用ResultToDocumentTransformer向變換器bean添加屬性「result-transformer」。 錯誤 =未能解析頻道名稱''

  • 使用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

我的確有一個想法是接受請求消息並將其轉換爲一個簡單的POJO,其中包含'name'和'command'字段。然後,我可以寫一個SpEL表達式,如'payload.command' –

回答

0

從我所看到的:

  1. 消息進入網關將其轉發到requestChannel
  2. requestChannel處理被轉發到鏈中,在第一步中將marshall對象使用org.springframework.oxm.jaxb.Jaxb2Marshaller轉換爲javax.xml.transform.dom.DOMResult
  3. 當您的有效負載爲DOMResult時,請嘗試使用xpath-router。

據我所知,XPath路由器工作正常,如果消息有效負載是包含純XML內部的字符串類型。因此,我建議在使用xpath路由器之前不要編組您的消息,而是先使用xpath路由器。

如果將馬歇爾的對象,這將是DOMResult類型,你將不得不面對DOMResult(可悲的,但真正的:))

...反正我覺得DOMResult是不是你想有什麼作爲消息有效載荷 - 也許你在編組和解組之間犯了錯誤?

+0

感謝您的建議,並且對於最近的回覆感到抱歉。我確實嘗試過,並沒有奏效。 「無論如何,我認爲DOMResult不是你想要的信息有效載荷 - 也許你在編組和解組之間犯了錯誤?」我想你是對的!! –

2

編組後,您可以使用Spring的"=object-to-string-transformer />"

相關問題