spring - Jackson 配置以使用rabbitmq 中的记录列表

标签 spring jackson rabbitmq spring-amqp jackson2

我正在使用 spring boot 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

如果我更改监听器方法以使用单个员工对象,它可以正常工作,并且我为其使用以下 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 配置来使用员工对象列表吗?

非常感谢!

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

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

最佳答案

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

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

在 1.6 之前,您要么需要消息 header 中的类型信息,要么需要使用类型信息配置转换器。

也就是说,由于转换器创建了一个 map ,这意味着这就是收到的内容(而不是列表)。

请在消息中显示 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]]

enter image description here

关于spring - Jackson 配置以使用rabbitmq 中的记录列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40491628/

相关文章:

Spring 启动@Transactional

java - jackson 反序列化问题与 map 中的 final类

.net-core - 配置 MassTransit 以使用 WebApplicationFactory<Startup> 进行测试

java - 使用 Spring Data 在执行期间更改了存储过程名称

java - 按下按钮并发送消息(Spring Boot 和 Vaadin)

java - 修复 Jackson 无法构造 Java.time.LocalDate 实例的问题

php - NodeJS AMQP 客户端无法连接

java - SpringAMQP 中的 Reply-To 是否已预先设置?

java - Spring WebSocket @SendToSession : send message to specific session

java - Jackson Mapper 具有特殊字符 é 问题