Spring Integration Flow中的对象方法参考

时间:2018-03-12 08:37:48

标签: spring-integration spring-integration-dsl

在通道上接收消息,并由变换器处理。变换器的输出是以下类,它将传递给流程中的下一步:

CREATE DATABASE name
    [ [ WITH ] [ OWNER [=] user_name ]
           [ TEMPLATE [=] template ]
           [ ENCODING [=] encoding ]
           [ LC_COLLATE [=] lc_collate ]
           [ LC_CTYPE [=] lc_ctype ]
           [ TABLESPACE [=] tablespace_name ]
           [ ALLOW_CONNECTIONS [=] allowconn ]
           [ CONNECTION LIMIT [=] connlimit ]
           [ IS_TEMPLATE [=] istemplate ] ]

另一个bean有一个public class DomainBean{ public DomainBean process() { // code return this; } } 方法,它调用上面bean上的@Transformer方法,如下所示:

process

在IntegrationFlow中,调用@Component public class Handler { @Transformer public Object handle(Message<?> message) throws MessagingException { DomainBean domainBean = (DomainBean) message; domainBean.process(); return domainBean ; } } 方法如下:

handle

理想情况下,我想取消.transform(handler) bean类,并使用对象方法引用调用Handler,如下所示:

domainBean.process()

当我尝试时,或.transform(DomainBean::process) 编译器抱怨

.<DomainBean, DomainBean>transform(DomainBean::process)

有没有让这项工作?

由于

1 个答案:

答案 0 :(得分:0)

你的问题不明确。 IntegrationFlowDefinition

中确实有这种方法
 * Populate the {@link MessageTransformingHandler} instance for the provided {@link GenericTransformer}.
 * @param genericTransformer the {@link GenericTransformer} to populate.
 * @param <S> the source type - 'transform from'.
 * @param <T> the target type - 'transform to'.
 * @return the current {@link IntegrationFlowDefinition}.
 * @see MethodInvokingTransformer
 * @see LambdaMessageProcessor
 */
public <S, T> B transform(GenericTransformer<S, T> genericTransformer) {

GenericTransformer实际上可以表示为lambda或方法引用,我们有足够的测试来确认。那里的代码看起来像:

.transform("hello "::concat)
...
.<String, Integer>transform(Integer::parseInt)
...
.<String, String>transform(String::toUpperCase)
...
.<MessagingException,  Message<?>>transform(MessagingException::getFailedMessage)

也许您需要的问题是在方法中添加精确的泛型agrs?因此:

.<DomainBean, DomainBean>transform(DomainBean::process)

然而,我发现您的DomainBean.process()void。此签名不符合transformer目的。是的,您可以使用Handler中的lambda或其他解决方案使用.handle()执行相同的操作。这个实际上可以调用void方法,说实话,这恰恰适合你的逻辑 - 到目前为止还没有任何转换逻辑。

但是当服务方法为void时,在流中调用此方法后没有任何延续。这样的.handle()必须是流定义中的最后一个单向端点。 void等于Outbound Channel Adapter