Spring integration 带注释的路由器提供字节[]作为参数,而不是POJO

Spring integration 带注释的路由器提供字节[]作为参数,而不是POJO,spring-integration,Spring Integration,我正在使用 Spring集成4.1.2.1版本 我正试图通过注释配置有效负载路由器。但是,我收到的是byte[]作为方法参数,而不是消息POJO。我试图按照本文中的建议对我的解决方案进行建模,但是答案使用本机类型作为消息,而我希望使用POJO。下面的配置代码中的auditPayloadRouter配置有哪些错误 有关注释: 完整配置: JSON消息转换器仅在内容类型消息属性包含JSON(如application/JSON)时才会转换JSON 否则,有效负载将保持为字节[] 在这种情况下,您将看到

我正在使用

Spring集成4.1.2.1版本

我正试图通过注释配置有效负载路由器。但是,我收到的是byte[]作为方法参数,而不是消息POJO。我试图按照本文中的建议对我的解决方案进行建模,但是答案使用本机类型作为消息,而我希望使用POJO。下面的配置代码中的auditPayloadRouter配置有哪些错误

有关注释:

完整配置:


JSON消息转换器仅在内容类型消息属性包含JSON(如application/JSON)时才会转换JSON

否则,有效负载将保持为字节[]

在这种情况下,您将看到一个警告日志

log.warn("Could not convert incoming message with content-type ["
    + contentType + "]");

我没有注意到那个日志消息。我应该注意,我正在为此替换一个工作的XML配置,XML版本正在正确处理路由。项目中有人更喜欢注释样式的配置,因此我正在转换我们的Spring集成配置。我验证了AMQP头包含内容类型:application/json,因此我开始在别处查找。事实证明,我需要在SimpleMessageListenerContainer和AMQBinboundChannelAdapter上设置messageConverter。
@Configuration
@EnableIntegration
public class AuditConfig2 {

    @Autowired
    AuditMessagingOperations auditMessagingOperations;

    private Queue auditQueue;
    private ConnectionFactory connectionFactory;

    @Autowired
    public void setAuditQueue(Queue auditQueue) {
        this.auditQueue = auditQueue;
    }

    @Autowired
    public void setConnectionFactory (ConnectionFactory connectionFactory) {
        this.connectionFactory = connectionFactory;
    }

    @Bean
    public AmqpInboundChannelAdapter amqpInboundChannelAdapter(
        @Qualifier("jsonMessageConverter") MessageConverter messageConverter
        , MessageChannel errorChannel) {

        SimpleMessageListenerContainer listenerContainer =
            new SimpleMessageListenerContainer(connectionFactory);
        listenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
        listenerContainer.setAutoStartup(true);
        listenerContainer.setConcurrentConsumers(1);
        listenerContainer.setMessageConverter(messageConverter);
        listenerContainer.setQueues(auditQueue);
        listenerContainer.setChannelTransacted(false);
        listenerContainer.setPrefetchCount(100);

        AmqpInboundChannelAdapter a = new
            AmqpInboundChannelAdapter(listenerContainer);
        a.setAutoStartup(true);
        a.setErrorChannel(errorChannel);
        a.setOutputChannel(auditRoutingChannel());
        return a;
    }

    @Bean(name="auditRoutingChannel")
    public MessageChannel auditRoutingChannel() {
        DirectChannel c = new DirectChannel();
        c.setComponentName("auditRoutingChannel");
        c.setBeanName("auditRoutingChannel");
        return c;
    }

    @Router(inputChannel="auditRoutingChannel", autoStartup="true",
        channelMappings= 
         {"com.company.data.model.shared.AccountAudit=audit.account",
          "com.company.data.model.shared.BlacklistAudit=audit.blacklist",
          "com.company.data.model.shared.MediaAudit=audit.item"})
    public String  auditPayloadRouter(Object o) {
        if (o == null) {
            return "errorChannel";
        }
        //DEBUG - Print out the unexpected byte[]
        String out = null;
        try {
            out = new String((byte[])o, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            System.out.println(e.getMessage());
        }
        System.out.println(out);
        if (o instanceof AccountAudit ||
            o instanceof BlacklistAudit ||
            o instanceof MediaAudit) {

            return o.getClass().getName();
        }
        return "nullChannel";
    }
}
log.warn("Could not convert incoming message with content-type ["
    + contentType + "]");