簡體   English   中英

如何使用 enrichHeaders 方法使用 java dsl 獲取 xml 元素的 xpath

[英]How to use enrichHeaders method to pick up xpath of an xml element using java dsl

我正在嘗試在 spring 集成中使用 java dsl 獲取 xml 元素的 xpth。 我試圖將元素名稱放在 enrichHeaders 方法中,但它似乎不起作用。 這是代碼:

return IntegrationFlows.from(Http.inboundGateway("/person")
                        .requestMapping(m -> m.methods(HttpMethod.POST)
                                .consumes("application/xml")
                                .produces("application/json")
                        )
                        )
                .enrichHeaders( h -> h.header("bsn","/BG:prsLa01/BG:body/BG:object/BG:bsn"))
                .transform(new XmlToJsonTransformer())
                .get();

支持 xPath:

https://docs.spring.io/spring-integration/docs/5.2.5.RELEASE/reference/html/xml.html#xpath-spel-function

xpath 規范 Function

Spring 集成,從 3.0 版本開始,提供內置的#xpath SpEL function,它調用 XPathUtils.evaluate(…) static 方法。 此方法委托給 org.springframework.xml.xpath.XPathExpression。 以下清單顯示了一些使用示例:

<transformer expression="#xpath(payload, '/name')"/>

<filter expression="#xpath(payload, headers.xpath, 'boolean')"/>

<splitter expression="#xpath(payload, '//book', 'document_list')"/>

<router expression="#xpath(payload, '/person/@age', 'number')">
    <mapping channel="output1" value="16"/>
    <mapping channel="output2" value="45"/>
</router>

#xpath() 還支持第三個可選參數,用於轉換 XPath 評估的結果。 它可以是字符串常量之一(字符串、boolean、數字、節點、node_list 和 document_list)或 org.springframework.xml.xpath.NodeMapper 實例。 默認情況下,#xpath SpEL function 返回 XPath 評估的字符串表示形式。

要啟用 #xpath SpEL function,您可以將 spring-integration-xml.jar 添加到類路徑中。 您無需聲明 Spring 集成 XML 命名空間中的任何組件。 有關詳細信息,請參閱“`Spring 表達式語言 (SpEL)”。

它可能看起來像這樣:

.enrichHeaders(h -> 
             h.headerExpression("bsn", "#xpath(payload, '/BG:body/BG:object/BG:bsn')"))

另一種方法可能是XPathExpressionEvaluatingHeaderValueMessageProcessor

https://docs.spring.io/spring-integration/api/org/springframework/integration/xml/transformer/support/XPathExpressionEvaluatingHeaderValueMessageProcessor.html

使用示例:

        @Bean
        public IntegrationFlow xpathHeaderEnricherFlow() {
            return IntegrationFlows.from("xpathHeaderEnricherInput")
                    .enrichHeaders(
                            s -> s.header("one",
                                    new XPathExpressionEvaluatingHeaderValueMessageProcessor("/root/elementOne"))
                                    .header("two",
                                            new XPathExpressionEvaluatingHeaderValueMessageProcessor("/root/elementTwo"))
                                    .headerChannelsToString("12345")
                                    .messageProcessor(m -> s.header("foo", "bar")),
                            c -> c.autoStartup(false).id("xpathHeaderEnricher")
                    )
                    .get();
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM