2014-02-26 92 views
3

我可能在這裏做錯了什麼,但我似乎沒有得到使用split()。方法組合時的預期結果。傳入消息之間的傳入xml稍有不同,其中的elementKey節點描述了我們要尋找的XML節點。使用自定義拆分方法的駱駝分割器

from("direct:fromWhereEver") 
    ... 
    .setHeader("dynamicToken", xpath("//*[local-name()='elementKey']/text()").stringResult()) 
    ... 
    .split().method(DynamicSplitToken.class, "extractTokens") 
    .to("direct:outgoing") 
.routeId("BhahBlah") 

我有以下的方法中定義的用於由路線

public class DynamicSplitToken { 
    public static Expression extractTokens(Exchange exchange){ 

     String splitToken = exchange.getIn().getHeader("dynamicToken").toString(); 

     TokenizeLanguage tok = new TokenizeLanguage(); 
     tok.setXml(true); 
     tok.setIncludeTokens(true); 
     tok.setToken(splitToken); 

     return tok.createExpression(); 
    } 
} 

現在XML標籤是從消息拉動沒有問題,但所得到的「主體」被提取並推通過包含<tagname>...</tagname>匹配上面的elementKey與之間沒有子節點/元素。我希望接收標籤之間的一切,也類似於如果我用下面的

.split().tokenizeXML("tagname") 

使用此方法時,我得到的標籤的全部內容和標籤之間的所有節點,unforunately我無法通過一個{header.dynaimcToken}給tokenizeXML ProcessorDefinition,否則我不需要在這裏尋求幫助。

我在哪裏出了錯這裏,我知道我在想念的方法處理後的重要一步,但無法確定是什麼

現在我們都堅持與駱駝2.9(保險絲ESB)如果有差別

乾杯 馬克

+0

+1對於動態地設置XPath表達式的想法。 –

回答

3

method()不得返回Expresssion但東西是可迭代如java.util.List,看到here。你原來的解決方案是相當接近,但你必須evaluate的表達,並返回其結果如:

protected static class DynamicSplitToken { 
    @SuppressWarnings("unchecked") 
    public static List<String> extractTokens(final Exchange exchange) { 
     final String splitToken = exchange.getIn().getHeader("dynamicToken").toString(); 

     final TokenizeLanguage tok = new TokenizeLanguage(); 
     tok.setXml(true); 
     tok.setIncludeTokens(true); 
     tok.setToken(splitToken); 

     final Expression expression = tok.createExpression(); 
     return expression.evaluate(exchange, List.class); 
    } 
} 
+0

感謝彼得,現在我明白了,這是完全有道理的。 – Mark