“简单”表达式语言 - 算术运算符?

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

我在骆驼路线中使用这个表达式:

.when(simple("${body.updateSeq} > ${property.PrevUpdateSeq} + 1"))
    .to("direct:someError")

然而,它对

+
符号感到害怕。

org.apache.camel.language.simple.types.SimpleIllegalSyntaxException: Unexpected token + at location 46
${body.updateSeq} > ${property.PrevUpdateSeq} + 1
                                              *

如何构造这个表达式,假设它从消息正文上 POJO 的 getter

getUpdateSeq
获取值,并将其压缩为 Exchange 上的属性(加 1)。

java apache-camel simple-el
4个回答
5
投票

Apache Camel 中包含的 Simple Languate 本身不支持 +

 操作。然而,它提供了一个 
++
 增量运算符,它要求左侧是一个函数。

最简单的解决方案是将操作重构为 bean

public class NextValueService { @Handler public Integer nextValue(Integer value) { return new Integer(value.intValue() + 1); } }

并在您的路线中使用它,如下所示:

.when(simple("${body.updateSeq} > ${bean:nextValueService?method=nextValue(property.PrevUpdateSeq)"})) .to("direct:someError")

用 f.e. 切换简单语言JavaScript 或 Groovy 也应该有助于解决这个问题。


5
投票
您还可以编写一个相当容易完成此操作的谓词。

public class MyPredicate implements Predicate { public boolean matches(final Exchange exchange) { return (exchange.getIn().getBody(Map.class).get("updateSeq") > (exchange.getProperty("PrevUpdateSeq") + 1)) } }

这假设主体是一个地图,如果它是一个 bean,则很容易更改 getBody()。然后像这样使用它:

.when(new MyPredicate()).to("direct:someError")

当您执行这样的自定义代码时,您应该尝试将其与路由分开。简单的表达语言非常有用,但如果过度使用,读起来会很糟糕。

编辑:如果您愿意,您甚至可以内联完成:

.when(new Predicate() { public boolean matches(final Exchange exchange) { return (exchange.getIn().getBody(Map.class).get("updateSeq") > (exchange.getProperty("PrevUpdateSeq") + 1)) }).to("direct:someError")
    

3
投票
以下是如何通过 javascript 完成此操作:

.when() .javaScript("parseInt(request.body.updateSeq) > parseInt(exchange.getProperty('PrevUpdateSeq')) + 1")

并且需要以下maven依赖:

<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-script</artifactId> <version>${camel.version}</version> </dependency>

或者我打赌这也是可能的

.groovy()

...


0
投票
使用camel 4.4 - 变量支持,你可以实现类似的东西;只是它不是很优雅,因为只能使用 ++ 或 -- 。

© www.soinside.com 2019 - 2024. All rights reserved.