0

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

public class DomainBean{

   public DomainBean process() {
      // code
      return this;
   }

}

另一个 bean 有一个@Transformer方法调用process上面 bean 上的方法,如下:

@Component
public class Handler {

    @Transformer
    public Object handle(Message<?> message) throws MessagingException {
        DomainBean domainBean = (DomainBean) message;
        domainBean.process();
        return domainBean ;
    }

}

在 IntegrationFlow 中,handle调用方法如下:

.transform(handler)

理想情况下,我想取消Handlerbean 类,并domainBean.process()使用对象方法引用进行调用,如下所示:

.transform(DomainBean::process)

当我尝试这样做时,或者.<DomainBean, DomainBean>transform(DomainBean::process) 编译器会抱怨

Non-static method cannot be referenced from a static context

有没有办法使这项工作?

谢谢

4

1 回答 1

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目的。是的,您可以对 lambda 执行相同的操作,Handler或者使用其他解决方案.handle()。这个真的可以调用void方法,老实说,这正是你的逻辑 - 到目前为止还没有任何转换逻辑。

但是,当服务方法void存在时,流程中此方法调用后没有任何继续。这样的 a.handle()必须是流定义中的最后一个单向端点。void等于出站通道适配器

于 2018-03-12T12:53:54.097 回答