使用SPEL解析XML消息

问题描述 投票:0回答:1

在我的Spring Integration管道中,我得到一个XML有效负载,根据XML中属性的值,我必须生成一个密钥并将其发布到kafka。

return IntegrationFlows.from(Kafka.messageDrivenChannelAdapter(kafkaListenerContainer))
                .wireTap(ACARS_WIRE_TAP_CHNL) // Log the raw message
                .enrichHeaders(h ->h.headerFunction(KafkaHeaders.MESSAGE_KEY, m -> {
                        StringBuilder header = new StringBuilder();
                        Expression expression = new SpelExpressionParser().parseExpression("payload.Body.toString()");
                        //Expression expression = new SpelExpressionParser().parseExpression("m.payload.Body.ACIFlight.fltNbr.toString()");
                        String flightNbr = expression.getValue(String.class);
                        header.append(flightNbr);
                        return header.toString();
                })) 
                .get();

XMl是

<?xml version="1.0" encoding="UTF-8"?>
<ns0:Envelope xmlns:ns0="http://www.exmaple.com/FlightLeg">
    <ns0:Header>
        <ns1:eventHeader xmlns:ns1="http://www.exmaple.com/header" eventID="659" eventName="FlightLegEvent" version="1.0.0">
            <ns1:eventSubType>FlightLeg</ns1:eventSubType>
        </ns1:eventHeader>
    </ns0:Header>
    <ns0:Body>
        <ns1:ACIFlight xmlns:ns1="http://ual.com/cep/aero/ACIFlight">
            <flightKey>1267:07042020:UA</flightKey>
            <fltNbr>1267</fltNbr>
            <fltLastLegDepDt>07042020</fltLastLegDepDt>
            <carrCd>UA</carrCd>
        </ns1:ACIFlight>
    </ns0:Body>
</ns0:Envelope>

我正在尝试使用spel从此xml有效负载中获取fltNbr。请建议

spring-el spring-integration-dsl
1个回答
0
投票

您可以使用XPath Header Enricher

XPath也可以作为Spel函数使用,但是在这种情况下,最好使用浓缩器。

public class XPathHeaderEnricher extends HeaderEnricher {

这里是一个测试用例...

    @Test
    public void convertedEvaluation() {
        Map<String, XPathExpressionEvaluatingHeaderValueMessageProcessor> expressionMap =
                new HashMap<String, XPathExpressionEvaluatingHeaderValueMessageProcessor>();
        XPathExpressionEvaluatingHeaderValueMessageProcessor processor = new XPathExpressionEvaluatingHeaderValueMessageProcessor(
                "/root/elementOne");
        processor.setHeaderType(TimeZone.class);
        expressionMap.put("one", processor);
        String docAsString = "<root><elementOne>America/New_York</elementOne></root>";
        XPathHeaderEnricher enricher = new XPathHeaderEnricher(expressionMap);
        Message<?> result = enricher.transform(MessageBuilder.withPayload(docAsString).build());
        MessageHeaders headers = result.getHeaders();
        assertThat(headers.get("one")).as("Wrong value for element one expression")
                .isEqualTo(TimeZone.getTimeZone("America/New_York"));
    }
© www.soinside.com 2019 - 2024. All rights reserved.