Spring 使用rabbitmq中记录列表的Jackson配置

Spring 使用rabbitmq中记录列表的Jackson配置,spring,jackson,rabbitmq,spring-amqp,jackson2,Spring,Jackson,Rabbitmq,Spring Amqp,Jackson2,我使用的是SpringBootAMQP,在其中我将使用队列中的雇员对象列表。我的侦听器方法如下所示: @RabbitListener(queues = "emp_queue") public void processAndPortEmployeeData(List<Employee> empList) { empList.forEach(emp -> { some logic }) } 如果我将侦听器方法更改为使用单个employee对象,它工作正常,我将使用以下ja

我使用的是SpringBootAMQP,在其中我将使用队列中的雇员对象列表。我的侦听器方法如下所示:

@RabbitListener(queues = "emp_queue")
public void processAndPortEmployeeData(List<Employee> empList) {
    empList.forEach(emp -> { some logic })
}
如果我将侦听器方法更改为使用单个employee对象,它工作正常,我将使用以下jackson配置:

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

}
是否需要执行其他jackson配置来使用employee对象列表

非常感谢

我将使用的示例输入Json消息:

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

您使用的是哪个版本的Spring AMQP

如果为1.6或更高版本,框架将参数类型传递给消息转换器

在1.6版本之前,您需要消息头中的类型信息,或者需要使用类型信息配置转换器

这就是说,由于转换器创建了一个映射,它意味着接收到的是映射(而不是列表)

请在消息中显示JSON的示例

编辑

请注意,如果只有一个bean是这种类型的,那么boot auto会配置消息转换器

@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 + "]";
        }

    }
}

感谢您的回复。我正在使用SpringBootStarter AMQP1.4.1,它使用SpringRabbit的1.6.2版。(两个都是最新的)也添加了示例输入json;您的配置错误;您应该使用的是
Jackson2JsonMessageConverter
-我将在几分钟后发布更新。谢谢!如果我只收到一个对象,上面的配置就可以正常工作。但是,需求发生了变化,我们将收到一个列表,在这些变化之后,它中断了。我根据您的编辑尝试了配置,但是如果我删除了DefaultMessageHandlerMethodFactory,并且在代码中没有实现RabbitListenerConfigurer,而只是使用Jackson2JsonMessageConverter配置,我将以字节的形式使用消息。
@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]]