Конфигурация Джексона для использования списка записей в rabbitmq

Я использую amqp с весенней загрузкой, в котором я буду использовать список объектов Employee из очереди. Мой метод слушателя выглядит так:

@RabbitListener(queues = "emp_queue")
public void processAndPortEmployeeData(List<Employee> empList) {
    empList.forEach(emp -> { some logic })
}

Однако, когда я пытаюсь использовать сообщение, я получаю исключение приведения класса: по какой-то причине я получаю LinkedHashMap.

Caused by: java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.integration.domain.Employee

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

@Configuration
@EnableRabbit
public class RabbitConfiguration implements RabbitListenerConfigurer {

@Bean
public MappingJackson2MessageConverter jackson2Converter() {
    return new MappingJackson2MessageConverter();
}

@Bean
public DefaultMessageHandlerMethodFactory handlerMethodFactory() {
    DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory();
    factory.setMessageConverter(jackson2Converter());
    return factory;
}

@Override
public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) {
    registrar.setMessageHandlerMethodFactory(handlerMethodFactory());
}

}

Есть ли какая-то другая конфигурация Джексона, которую мне нужно сделать, чтобы использовать список объектов сотрудников?

Большое спасибо!

Пример сообщения ввода Json, которое я буду использовать:

[
  {
    "name" : "Jasmine",
    "age" : "24",
    "emp_id" : 1344
  },
  {
    "name" : "Mark",
    "age" : "32",
    "emp_id" : 1314
  }
]

person vin4yak    schedule 08.11.2016    source источник


Ответы (1)


Какую версию Spring AMQP вы используете?

Если версия 1.6 или выше, платформа передает тип аргумента преобразователю сообщений.

До 1.6 вам либо нужна информация о типе в заголовках сообщений, либо вам нужно настроить конвертер с информацией о типе.

Тем не менее, поскольку конвертер создал карту, это означает, что это было то, что было получено (а не список).

Пожалуйста, покажите образец JSON в сообщении.

ИЗМЕНИТЬ

Обратите внимание, что загрузка автоматически настраивает преобразователь сообщений, если есть один bean-компонент этого типа...

@SpringBootApplication
public class So40491628Application {

    public static void main(String[] args) throws Exception {
        ConfigurableApplicationContext context = SpringApplication.run(So40491628Application.class, args);
        Resource resource = new ClassPathResource("data.json");
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        FileCopyUtils.copy(resource.getInputStream(), baos);
        context.getBean(RabbitTemplate.class).send("foo", MessageBuilder.withBody(baos.toByteArray())
            .andProperties(MessagePropertiesBuilder.newInstance().setContentType("application/json").build()).build());
        Thread.sleep(10000);
        context.close();
    }

    @Bean
    public Jackson2JsonMessageConverter converter() {
        return new Jackson2JsonMessageConverter();
    }

    @Bean
    public Queue foo() {
        return new Queue("foo");
    }

    @RabbitListener(queues = "foo")
    public void listen(List<Employee> emps) {
        System.out.println(emps);
    }

    public static class Employee {

        private String name;

        private String age;

        private int empId;

        public String getName() {
            return this.name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getAge() {
            return this.age;
        }

        public void setAge(String age) {
            this.age = age;
        }

        public int getEmpId() {
            return this.empId;
        }

        public void setEmpId(int empId) {
            this.empId = empId;
        }

        @Override
        public String toString() {
            return "Employee [name=" + this.name + ", age=" + this.age + ", empId=" + this.empId + "]";
        }

    }
}

Результат:

[Employee [name=Jasmine, age=24, empId=0], Employee [name=Mark, age=32, empId=0]]

введите здесь описание изображения

person Gary Russell    schedule 08.11.2016
comment
Спасибо за ваш ответ. Я использую spring-boot-starter-amqp 1.4.1, который использует версию 1.6.2 spring-rabbit. (оба последние) - person vin4yak; 08.11.2016
comment
также добавлен образец ввода json. - person vin4yak; 08.11.2016
comment
Ой; ваша конфигурация неверна; вы должны использовать Jackson2JsonMessageConverter - я опубликую обновление через несколько минут. - person Gary Russell; 08.11.2016
comment
Спасибо! Приведенные выше конфигурации работают нормально, если я получаю один объект. Однако требование изменилось, и мы будем получать список, и после изменений он сломался. - person vin4yak; 08.11.2016
comment
Я попробовал конфигурацию в соответствии с вашим редактированием, но если я удалю DefaultMessageHandlerMethodFactory и не реализую RabbitListenerConfigurer в своем коде, а просто использую конфигурацию Jackson2JsonMessageConverter, я буду использовать сообщение в виде байтов. - person vin4yak; 08.11.2016
comment
Отправитель не устанавливает заголовок contentType? Смотрите моего отправителя. Задействованы два преобразователя . Вывод типа работает с первым преобразователем. - person Gary Russell; 08.11.2016
comment
Приложение upstream еще не создано, поэтому я вручную отправлял сообщение с помощью пользовательского интерфейса rabbitmq. Но похоже, что я не могу отправить сообщение, используя пользовательский интерфейс в виде строки. Думаю, мне нужно написать пример приложения, чтобы отправить его в очередь, используя свойства, которые вы использовали! - person vin4yak; 08.11.2016
comment
Вы можете использовать пользовательский интерфейс администратора — я делаю это все время; просто установите для свойства content_type значение application/json. - person Gary Russell; 08.11.2016
comment
Вы правы.. Это работает! Благодаря тонну! Если подумать, в моем предыдущем проекте, который был основан на spring-integration, я много пользовался вашими туториалами! Ты обалденный. - person vin4yak; 08.11.2016