Spring XD - 过滤器中 SpEL 表达式中的 instanceof

Spring XD - instanceof in SpEL expression in filter

我正在尝试在流过滤器的 SpEL 表达式中使用 instanceof 运算符。我正在尝试以下操作:

stream create myStream --definition "tap:job:jobName > filter --expression='payload instanceof T(com.package.name.event.SomeEvent)' | log --deploy

我正在将自己的活动发布到 xd.job.aggregatedEvents 频道。我的意图是通过使用 instanceof 运算符进行过滤来仅记录我的 SomeEvent。

问题是我收到以下错误:

org.springframework.expression.spel.SpelEvaluationException: EL1005E:(pos 0): Type cannot be found 'com.package.name.event.SomeEvent'

我的问题是有人能告诉我 SpEL 表达式中 instanceof 的正确语法吗?或者如果这是正确的语法那么问题可能是什么?

根据 StackStrace - Type cannot be foundStandardTypeLocator 中的逻辑:

try {
    return ClassUtils.forName(nameToLookup, this.classLoader);
}
catch (ClassNotFoundException ey) {
    // try any registered prefixes before giving up
....
throw new SpelEvaluationException(SpelMessage.TYPE_NOT_FOUND, typeName);

您最终遇到了 ClassNotFoundException 这样的问题。因此,带有 com.package.name.event.SomeEvent 的 jar 在 XD CLASSPATH 之外。

你可以用文字来比较:

--expression='payload.class.name == '''com.package.name.event.SomeEvent''''

或者将你的 jar 放到 dirt container 类路径中。

从另一方面来说,为消息系统使用 domain-specific 类型总是一个坏主意。您应该考虑如何使用标准支持的类型来克服这个问题,并将检查条件替换为某个值(在标准类型中)到消息 headers.