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

时间:2015-03-02 15:43:03

标签: spring-xd

我正在尝试在流的过滤器中的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的正确语法吗?或者,如果这是正确的语法,那么问题可能是什么?

1 个答案:

答案 0 :(得分:1)

根据StackStrace - Type cannot be found和来自StandardTypeLocator的逻辑:

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类路径。

从另一方面来说,将特定于域的类型用于消息传递系统始终是一个坏主意。您应该考虑如何使用标准支持的类型克服这种情况,并将检查条件替换为消息头中的某个值(在标准类型中)。