Java LambdaMessageProcessor不';无法识别转换服务的有效负载类型

Java LambdaMessageProcessor不';无法识别转换服务的有效负载类型,java,spring,spring-integration,spring-java-config,Java,Spring,Spring Integration,Spring Java Config,我正在使用SpringIntegration4.2.5.RELEASE和SpringIntegrationJavaDSL1.1.2.RELEASE 我在进行自定义转换工作时遇到困难。我已经注册了自定义转换器,将其从byte[]转换为my.object.MyClass @Bean @IntegrationConverter public Converter bytesToMyClass() { return new Converter<byte[], my.object.MyClas

我正在使用SpringIntegration4.2.5.RELEASE和SpringIntegrationJavaDSL1.1.2.RELEASE

我在进行自定义转换工作时遇到困难。我已经注册了自定义转换器,将其从
byte[]
转换为
my.object.MyClass

@Bean
@IntegrationConverter
public Converter bytesToMyClass() {
    return new Converter<byte[], my.object.MyClass>() {
        @Override
        public my.object.MyClass convert(byte[] source) {

            try {
                return my.object.MyClass.newBuilder().mergeFrom(source).build();
            } catch (InvalidProtocolBufferException e) {
                throw new RuntimeException("Could not convert message.", e);
            }
        }
    };
}
但是,当我试着运行它时,我得到了以下异常
java.lang.ClassCastException:[B不能强制转换到my.object.MyClass
(下面是完整的堆栈)

经过一些调试后,我注意到当
org.springframework.integration.dsl.LambdaMessageProcessor#processMessage
尝试处理消息时,
payloadType
java.lang.Object
,而我认为它应该是
my.Object.MyClass

似乎我所有的泛型都是正确的,我遗漏了什么

完整堆栈跟踪:

ERROR o.s.i.handler.LoggingHandler - org.springframework.messaging.MessageHandlingException: nested exception is java.lang.ClassCastException: [B cannot be cast to my.object.MyClass
    at org.springframework.integration.dsl.LambdaMessageProcessor.processMessage(LambdaMessageProcessor.java:130)
    at org.springframework.integration.router.AbstractMessageProcessingRouter.getChannelKeys(AbstractMessageProcessingRouter.java:80)
    at org.springframework.integration.router.AbstractMappingMessageRouter.determineTargetChannels(AbstractMappingMessageRouter.java:148)
    at org.springframework.integration.router.AbstractMessageRouter.handleMessageInternal(AbstractMessageRouter.java:154)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127)
    at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:147)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:120)
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:77)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:442)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:392)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:45)
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:105)
    at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:231)
    at org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:154)
    at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:102)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:105)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127)
    at org.springframework.integration.endpoint.PollingConsumer.handleMessage(PollingConsumer.java:103)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.doPoll(AbstractPollingEndpoint.java:251)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.access$000(AbstractPollingEndpoint.java:57)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:176)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:173)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller$1.run(AbstractPollingEndpoint.java:330)
    at org.springframework.integration.util.ErrorHandlingTaskExecutor$1.run(ErrorHandlingTaskExecutor.java:55)
    at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
    at org.springframework.integration.util.ErrorHandlingTaskExecutor.execute(ErrorHandlingTaskExecutor.java:51)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller.run(AbstractPollingEndpoint.java:324)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassCastException: [B cannot be cast to my.object.MyClass
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springframework.integration.dsl.LambdaMessageProcessor.processMessage(LambdaMessageProcessor.java:127)
    ... 37 more

Lambda的问题在于无法在运行时确定泛型类型:

这就是为什么我们在这个问题上有一个重载方法:

 .<my.object.MyClass, Boolean>route(my.object.MyClass.class, payload -> insertBuffer > 1, mapping -> mapping
.route(my.object.MyClass.class,有效负载->插入缓冲区>1,映射->映射

这让我更进一步了。谢谢。对聚合器有什么建议吗?它似乎只是聚合
字节[]
,我希望它先进行转换,然后再聚合。这可能吗?我需要一个自定义处理器来做吗?M-M-M。一个新的SO问题?嗯。我刚刚卡住了一个
转换(my.object.MyClass.class,M->M)
在聚合器前面。有点违反直觉,但已经足够好了。??不,没有。记住责任级别和松散耦合原则,它们在Spring Integration中无处不在?因此,如果要在聚合之前转换数据,请在
.transform()
!中进行转换,然后让
.aggregate()进行转换
只关注聚合。我同意,但我在转换与转换之间走的是一条细线。从技术上讲,我不是在转换,我是在将
字节
转换为它们确切的
对象
表示。但据我所知,聚合器在聚合之前不会应用
转换服务
。所以,我只做一个“无操作”转换,让Spring在聚合之前自动转换。
 .<my.object.MyClass, Boolean>route(my.object.MyClass.class, payload -> insertBuffer > 1, mapping -> mapping