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