RabbitMQ消息转换问题
RabbitMQ message conversion issue
我在消费者端使用消息后将消息转换为对象格式时遇到问题。我无法转换回 Student 对象。仅供参考,在生产者端使用 spring RabbitTemplate,在消费者端使用 java api(注意:我不能在消费者端使用 spring)
问题:
org.codehaus.jackson.map.JsonMappingException: 无法从JSON String实例化[简单类型, class com.steelwedge.util.Student]类型的值;没有单字符串 constructor/factory 方法
在 org.codehaus.jackson.map.deser.std.StdValueInstantiator._createFromStringFallbacks(StdValueInstantiator.java:379)
在 org.codehaus.jackson.map.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:268)
在 org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromString(BeanDeserializer.java:765)
在 org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:585)
生产者代码:(使用Spring-RabbitTemplate)
Student student = new Student();
student.setCompany("RLR");
student.setName("Pandi");
String jsonString = new ObjectMapper().unMarshall(student);
template.convertAndSend(jsonString);
消费者代码:
String message = null;
delivery = consumer.nextDelivery(100);
if (delivery != null) {
message = new String(delivery.getBody());
}
ObjectMapper mapper = new ObjectMapper();
Student apiRequest = mapper.readValue(message, Student.class);
我不确定你的 unMarshall()
方法是什么,但我刚刚用 Jackson2 测试没有问题...
Foo foo = new Foo();
foo.setFoo("foo");
foo.setBar("bar");
String fooString = new ObjectMapper().writeValueAsString(foo);
template.convertAndSend("", "foo", fooString);
Channel channel = cf.createConnection().createChannel(false);
GetResponse response = channel.basicGet("foo", true);
String in = new String(response.getBody());
Foo fooIn = new ObjectMapper().readValue(in, Foo.class);
System.out.println(fooIn);
但是,您简化了发送方,框架将负责转换...
template.setMessageConverter(new Jackson2JsonMessageConverter());
template.convertAndSend("", "foo", foo);
response = channel.basicGet("foo", true);
in = new String(response.getBody());
fooIn = new ObjectMapper().readValue(in, Foo.class);
System.out.println(fooIn);
编辑:
刚刚用 Jackson 1 (codehaus) 测试没有问题...
Foo foo = new Foo();
foo.setFoo("foo");
foo.setBar("bar");
String fooString = new ObjectMapper().writeValueAsString(foo);
template.convertAndSend("", "foo", fooString);
Channel channel = cf.createConnection().createChannel(false);
GetResponse response = channel.basicGet("foo", true);
String in = new String(response.getBody());
Foo fooIn = new ObjectMapper().readValue(in, Foo.class);
System.out.println(fooIn);
我在消费者端使用消息后将消息转换为对象格式时遇到问题。我无法转换回 Student 对象。仅供参考,在生产者端使用 spring RabbitTemplate,在消费者端使用 java api(注意:我不能在消费者端使用 spring)
问题: org.codehaus.jackson.map.JsonMappingException: 无法从JSON String实例化[简单类型, class com.steelwedge.util.Student]类型的值;没有单字符串 constructor/factory 方法 在 org.codehaus.jackson.map.deser.std.StdValueInstantiator._createFromStringFallbacks(StdValueInstantiator.java:379) 在 org.codehaus.jackson.map.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:268) 在 org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromString(BeanDeserializer.java:765) 在 org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:585)
生产者代码:(使用Spring-RabbitTemplate)
Student student = new Student();
student.setCompany("RLR");
student.setName("Pandi");
String jsonString = new ObjectMapper().unMarshall(student);
template.convertAndSend(jsonString);
消费者代码:
String message = null;
delivery = consumer.nextDelivery(100);
if (delivery != null) {
message = new String(delivery.getBody());
}
ObjectMapper mapper = new ObjectMapper();
Student apiRequest = mapper.readValue(message, Student.class);
我不确定你的 unMarshall()
方法是什么,但我刚刚用 Jackson2 测试没有问题...
Foo foo = new Foo();
foo.setFoo("foo");
foo.setBar("bar");
String fooString = new ObjectMapper().writeValueAsString(foo);
template.convertAndSend("", "foo", fooString);
Channel channel = cf.createConnection().createChannel(false);
GetResponse response = channel.basicGet("foo", true);
String in = new String(response.getBody());
Foo fooIn = new ObjectMapper().readValue(in, Foo.class);
System.out.println(fooIn);
但是,您简化了发送方,框架将负责转换...
template.setMessageConverter(new Jackson2JsonMessageConverter());
template.convertAndSend("", "foo", foo);
response = channel.basicGet("foo", true);
in = new String(response.getBody());
fooIn = new ObjectMapper().readValue(in, Foo.class);
System.out.println(fooIn);
编辑:
刚刚用 Jackson 1 (codehaus) 测试没有问题...
Foo foo = new Foo();
foo.setFoo("foo");
foo.setBar("bar");
String fooString = new ObjectMapper().writeValueAsString(foo);
template.convertAndSend("", "foo", fooString);
Channel channel = cf.createConnection().createChannel(false);
GetResponse response = channel.basicGet("foo", true);
String in = new String(response.getBody());
Foo fooIn = new ObjectMapper().readValue(in, Foo.class);
System.out.println(fooIn);