我有以下Spring集成流程:
@Bean
public IntegrationFlow checkoutEventFlow(){
return IntegrationFlows.from(EventASink.INPUT)
.filter("headers['type'] == 'TYPE_A'") //1
.transform(Transformers.fromJson(EventA.class)) //2
.<EventA, EventB> transform(eventA ->
new EventB(
eventA.getSomeField(),
eventB.getOtherField()))
.handle(Http.outboundGateway(uri).httpMethod(HttpMethod.POST))
.get();
}
1)我想根据邮件的标题过滤邮件而不使用SpEl表达式(请看// 1),可以吗?
2)是否存在另一种无需// 2的JSON转换为POJO的机制?我喜欢可以使用POJO编写@StreamListener的方式,并且可以在后台进行转换。
谢谢。
答案 0 :(得分:1)
filter()
中没有SpEL,您可以改为执行Java lambda:
.filter(Message.class, m -> m.getHeaders().get("type") == "TYPE_A")
Spring Cloud Stream是经过公证的框架,其中JSON作为数据的默认内容类型,流经该流并传入/传出目标消息传递系统。
Spring Integration是一个库,可用于构建集成应用程序。在这里,我们对某些默认的内容类型转换没有任何意见。没有任何开箱即用的猜测,因为JSON,您将要把传入的byte[]
转换成某种POJO。尽管为了纪念一些与Spring Cloud Stream一样可见的可能性,我们在POJO方法调用程序中有一个钩子,可以将JSON转换为预期的POJO。但是,只有在自定义POJO方法也标记为@serviceActivator
时,才对它们进行此操作。从这里开始,我们无法在.transform()
lambda中假设您的期望。您需要使用method提供一些服务,并在以下位置使用它:
/**
* Populate a {@link ServiceActivatingHandler} for the
* {@link org.springframework.integration.handler.MethodInvokingMessageProcessor}
* to invoke the {@code method} for provided {@code bean} at runtime.
* In addition accept options for the integration endpoint using {@link GenericEndpointSpec}.
* @param service the service object to use.
* @param methodName the method to invoke.
* @return the current {@link IntegrationFlowDefinition}.
*/
public B handle(Object service, String methodName) {
这种方式的工作方式与使用@StreamListener
在Spring Cloud Stream中看到的方式相同。