使用Jackson2为RabbitMQ编组/解组POJO。没有在头部设置类型?

时间:2015-09-27 12:25:59

标签: jackson marshalling spring-amqp

我试图从Rabbit获取java对象但是得到了这个

   Caused by: org.springframework.amqp.support.converter.MessageConversionException: failed to convert Message content. Could not resolve __TypeId__ in header

所以我可以改变远程服务器格式,然后我应该如何更新我的bean?

@Bean
public MessageConverter jsonMessageConverter() {
    return new Jackson2JsonMessageConverter();
}

以及如何发送回信息?

使用DefaultClassMapper

出现同样的错误

 Caused by: org.springframework.amqp.support.converter.MessageConversionException: failed to convert Message content. Could not resolve __TypeId__ in header 

代码

@Bean
public DefaultClassMapper typeMapper() {
    DefaultClassMapper typeMapper = new DefaultClassMapper();
    typeMapper.setDefaultType(MyType.class);
    return typeMapper;
}

@Bean
public MessageConverter jsonMessageConverter(DefaultClassMapper defaultClassMapper) {
    Jackson2JsonMessageConverter jsonMessageConverter = new Jackson2JsonMessageConverter();
    jsonMessageConverter.setClassMapper(defaultClassMapper);
    return jsonMessageConverter;
}

我无法将Object转换为JSON。  我有转换器类

   public class MySendTypeSerializer extends JsonSerializer<MySendType> { 
   @Override
   public void serialize(MySendType mySendType, JsonGenerator jsonGenerator, SerializerProvider provider) throws IOException {   //.. impl }}

和课堂本身

  @JsonSerialize(using = MySendTypeSerializer.class)
  public class MySendType { 
       // Regular POJO
  } 

尽管使用@JsonDeserialize的Deserializer运行良好,但所有这些东西都没有调用过。可能我错过了这个队列的配置(发送队列)与接收队列不同。

现在转换器配置看起来像这样

@Bean
SimpleMessageListenerContainer persistenceListenerContainer(ConnectionFactory connectionFactory,
                                                            @Qualifier("persistenceListenerAdapter") MessageListenerAdapter listenerAdapter,
                                                            MessageConverter messageConverter) {
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
    container.setConnectionFactory(connectionFactory);
    container.setQueues(sendQueue());
    listenerAdapter.setMessageConverter(new Jackson2JsonMessageConverter());
    container.setMessageListener(listenerAdapter);
    return container;
}

这可能仅适用于JSON-&gt; Object ??

1 个答案:

答案 0 :(得分:1)

如果您没有使用默认的类映射器标头来传达类型信息,则需要提供自定义ClassMapper或自定义DefaultClassMapper

如果您的类型是固定的,如果消息中没有信息来确定类型,则默认类映射器将回退到其默认类型:

myDefaultClassMapper.setDefaultType(MyType.class);

然后将映射器注入消息转换器。