2015-04-06 68 views
0

我使用注释的路由器被设置字节[]作为参数,而不是POJO

Spring集成4.1.2.RELEASE

我试图通过注解来配置有效载荷路由器。但是,我正在接收一个字节[]作为方法参数,而不是消息POJO。我试图按照SO answer中的建议建模我的解决方案,但答案使用本机类型作为消息,而我希望使用POJO。我在下面的配置代码中的auditPayloadRouter配置中做了什么错误?

诠释问题:

@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) 

满配置:

@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"; 
    } 
} 

回答

0

如果content_type消息属性包含json的JSON消息转换器将仅转换JSON - 如application/json

否则,有效负载保持为byte[]

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

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

我不遵守那条日志信息。我应该注意到,我正在为此替换一个可用的XML配置,并且XML版本正确地处理了路由。项目中有些人喜欢使用注释风格进行配置,因此我正在转换我们的Spring Integration配置。 –

+0

我想我发现了这个问题。我证实AMQP头文件包含content_type:application/json,所以我开始寻找其他地方。事实证明,我需要在SimpleMessageListenerContainer和AmqpInboundChannelAdapter上都设置messageConverter。 –

相关问题