Jackson 配置以使用 rabbitmq 中的记录列表
Jackson configuration to consume list of records in rabbitmq
我正在使用 spring boot amqp,我将在其中使用队列中的 Employee 对象列表。我的侦听器方法如下所示:
@RabbitListener(queues = "emp_queue")
public void processAndPortEmployeeData(List<Employee> empList) {
empList.forEach(emp -> { some logic })
}
但是,当我尝试使用该消息时,我得到一个 class 强制转换异常:出于某种原因,我得到一个 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 之前,您要么需要消息头中的类型信息,要么需要使用类型信息配置转换器。
也就是说,由于转换器创建了地图,这意味着收到的是地图(不是列表)。
请在消息中显示 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]]
我正在使用 spring boot amqp,我将在其中使用队列中的 Employee 对象列表。我的侦听器方法如下所示:
@RabbitListener(queues = "emp_queue")
public void processAndPortEmployeeData(List<Employee> empList) {
empList.forEach(emp -> { some logic })
}
但是,当我尝试使用该消息时,我得到一个 class 强制转换异常:出于某种原因,我得到一个 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 之前,您要么需要消息头中的类型信息,要么需要使用类型信息配置转换器。
也就是说,由于转换器创建了地图,这意味着收到的是地图(不是列表)。
请在消息中显示 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]]