我将DSL和Lambdas与Spring Integration库一起使用,遇到了一个奇怪的问题。
我试图构建一个IntegrationFlow,它将以换行符分割文件数据。当我将lambda表达式内联到构建器时,它运行良好:
return IntegrationFlows.from(this.inboundStreamingMessageSource())
.transform(new StreamTransformer("UTF-8"))
.split(s->s.applySequence(true).get().getT2().setDelimiters("\n"))
在上面的示例中,split方法正在接收SplitterEndpointSpec的使用者。那时,为了便于阅读,我将lambda分解到其自己的字段中:
return IntegrationFlows.from(this.inboundStreamingMessageSource())
.transform(new StreamTransformer("UTF-8"))
.split(NewlineSplitter)
...
final Consumer<SplitterEndpointSpec<DefaultMessageSplitter>> NewlineSplitter =
s -> s.applySequence(true).get().getT2().setDelimiters("\n");
但是,我得到一个运行此的stacktrace异常。当前:
org.springframework.messaging.MessageHandlingException:嵌套异常为java.lang.IllegalArgumentException:找不到消息的候选方法
在另一个时间,我收到了一个Classcast异常,指出无法将String.class类型转换为SplitterEndpointSpec。如果查看我从中调用split
的 IntegrationFlowDefinition 的API文档,您会发现该方法有很多阴影:参数长度大约有12种变化。编译器是否误解了我要调用的拆分版本?
我根本看不到是什么原因引起的,并且不确定这是Java 8错误还是Spring-integration实现的问题。我使用的是spring-integration-dsl 1.2.3.RELEASE,由于目前在为该库构建的另一个库中定义的依赖项,目前可能仍停留在该版本上。
答案 0 :(得分:0)
首先,您不需要执行get().getT2().setDelimiters("\n")
-delimiters()
上已经有一个SplitterEndpointSpec
选项:
s.applySequence(true).delimiters("\n")
第二,它看起来更像是您使用的编译器的问题。刚刚使用以下命令测试了您的用例:
java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode)
运行良好,没有任何抱怨和运行时错误。
另一方面,我使用最新的Spring Integration。你呢?正在使用什么版本?