2015-09-27 1 views
1

Я пытаюсь получить объект Java из кролика, но получил этоMarshalling/unmarshalling POJO с Jackson2 для RabbitMQ. Без типа, установленного в голове?

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

Так что я могу изменить формат удаленного сервера, как я должен обновить свой боб тогда?

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

Я не могу преобразовать объект в 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 работает хорошо. Вероятно, я пропустил что-то в конфигурации для этой очереди (очередь отправки) отличается от ее получения.

Сейчас конвертер конфигурации выглядит следующим образом

@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-> Object ??

ответ

1

Если вы не используете заголовки сопоставления класса по умолчанию для передачи информации о типе, вам необходимо предоставить пользовательский номер ClassMapper или настроить DefaultClassMapper.

Если ваш тип фиксирован, класс по умолчанию картограф возвращается к своему типу по умолчанию, если нет информации в сообщении, чтобы определить тип:

myDefaultClassMapper.setDefaultType(MyType.class); 

Затем впрыскивает картограф в конвертер сообщений.

+0

Как это сделать точно ?? Я сделал Публичный классMyTypeSerializer расширяет JsonSerializer Не слишком большой успех –

+0

Вам нужно точно описать, что вы хотите. Должны ли ваши сообщения всегда конвертироваться в объекты одного класса? Или вам нужно каким-то образом определить, к какому классу нужно преобразовать, основываясь на некоторой информации в сообщении? Если да, то какая информация? С этой информацией я могу помочь вам дальше. –

+0

Мне нужно получить один тип и отправить другой тип. Типы никогда не меняются. Таким образом, JSON все тот же. –