#java #jackson #rabbitmq
#java #джексон #rabbitmq
Вопрос:
Я использую RabbitMQ для отправки сообщений в очередь, и у потребителя я получаю его, но я не могу его отбросить.
Когда я отправляю его, я делаю это.
rabbitTemplate.convertAndSend("myExchange", "binding", MyObject);
MyObject
в этом проекте создан пользовательский объект. В другом проекте я создал MyObject.class
точно такой же (но я знаю, что сигнатура объекта не совпадает).
Преобразованный набор для моего слушателя следующий.
Jackson2JsonMessageConverter jsonMessageConverter() {
Jackson2JsonMessageConverter messageConverter = new Jackson2JsonMessageConverter();
messageConverter.setClassMapper(classMapper());
return messageConverter;
}
private ClassMapper classMapper() {
DefaultClassMapper classMapper = new DefaultClassMapper();
classMapper.setDefaultType(MyObject.class);
return classMapper;
}
Итак, на моем слушателе следующий код не работает. Я заметил, что тело поставляется с [B@1232(byte[232]
.
@Override
public void onMessage(final Message message) {
final MyObject myObject = (MyObject) messageConverter.fromMessage(message);
Как мне этого добиться?
Комментарии:
1. Ты должен получить
ClassCastException
. Это верно? Не могли бы вы опубликовать полную трассировку стека?
Ответ №1:
Поместите класс MyObject в отдельный jar. Ссылайтесь на этот новый jar как от отправителя, так и от получателя.
Дополнительная информация
Строка является объектом. Преобразуйте ваш объект в json (в виде строки) и передайте jsonString в качестве третьего параметра convertAndSend.
В получателе вы должны сделать что-то вроде этого:
final String jsonString = (String) messageConverter.fromMessage(message);
Комментарии:
1. есть ли какой-нибудь способ не делиться ими?
2. не уверен. вы могли бы преобразовать объект в json, затем отправить json в виде сообщения (в виде строки), затем, на другом конце, получить строку и преобразовать ее из json в локально определенный, но с тем же классом members.
3. любой пример того, как это сделать?
4. пример чего? отправка json в виде сообщения? реализация двух классов, которые создают (и создаются из) один и тот же json?
5. в принципе, да, я использую convertAndSend… не уверен, как сделать то, что вы описали.
Ответ №2:
Убедитесь, что вы установили MessageConverter
на стороне отправителя значение Jackson2JsonMessageConverter
, если вы хотите использовать сообщение на стороне получателя в виде json.
Jackson2JsonMessageConverter messageConverter = ...; // create and configure
rabbitTemplate.setMessageConverter(messageConverter);
rabbitTemplate.convertAndSend("myExchange", "binding", MyObject);
В противном случае для отправки сообщения используется значение по умолчанию SimpleMessageConverter
.
Преобразователем по умолчанию является SimpleMessageConverter, который способен обрабатывать массивы байтов, строки и сериализуемые объекты в зависимости от заголовка типа содержимого сообщения.
Так что я предполагаю, что ваш MyObject
есть Serializable
, и значение по умолчанию MessageConverter
сериализует его в массив байтов. Как вы сказали
Итак, на моем слушателе следующий код не работает. Я заметил, что тело поставляется с [B @ 1232(байт [232].