Search code examples
spring-integrationspring-integration-dslspring-integration-http

Can SpEL in Spring Integration Router use Java's String class methods


This is an extension question to How to use SpEL to read payload and header content in a Spring Integration Router

Technologies in my project

Spring Boot 2
Spring Integration (XML style)
Java 8
Tomcat 9.x/Liberty 19.0.0.1

As a part of my Spring Integration project (REST API with an inbound-http-gateway, that takes an XML input and produces an XML output), this is the setup for my question:

  • There is a Builder-pattern-based Java object (say, MyPOJO) that is the payload in the flow.
  • MyPOJO has a String property/instance variable (say, String response) along with a getter and setter.
  • Somewhere in the flow, MyPOJO gets built and response gets set.
  • Inside response, there is a keyword/specific piece of text that will determine the further course of the flow.

This said, is it possible to write a Router (using XML configuration) that can check if the response inside Message<MyPOJO> contains that keyword/specific piece of text to determine where to go next?

Illustratively, something like this:

<int:router input-channel="inputChannel" expression="payload.getResponse().contains("keyword")">
    <int:mapping value="true" channel="oneRoute"/>
    <int:mapping value="false" channel="anotherRoute"/>
</int:router>

When I do this and launch the application, the error is:

nested exception is org.xml.sax.SAXParseException; lineNumber: 44; columnNumber: 98; Element type "int:router" must be followed by either attribute specifications, ">" or "/>"

Specifically speaking, the expression="payload.getResponse().contains("keyword")" part seems to be having an issue getting resolved and this could be something to do with the quotation marks around the keyword

Any help on this is greatly appreciated.

Sincerely, Bharath


Solution

  • OK. I see you have an XML syntax error. The fix is like this:

    expression="payload.getResponse().contains('keyword')"
    

    The keyword is in single quotes, not double.

    This is definitely how SpEL works: when you would like to specify a literal in the expression, you need to use single quotes: https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#expressions-evaluation