带有Lambda的Java阴影产生尴尬的行为

时间:2018-08-02 17:31:49

标签: java lambda java-8 spring-integration spring-integration-dsl

我将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,由于目前在为该库构建的另一个库中定义的依赖项,目前可能仍停留在该版本上。

1 个答案:

答案 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。你呢?正在使用什么版本?