在使用者端消费消息后,将消息转换为对象格式时遇到问题。我无法转换回Student对象。仅供参考,在生产者端使用spring RabbitTemplate,在消费者端使用纯Java api(注意#:我不能在消费者端使用spring)
问题: org.codehaus.jackson.map.JsonMappingException:无法从JSON字符串实例化类型[简单类型,类com.steelwedge.util.Student]的值;org.codehaus.jackson.map.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.org.org.codehaus.jackson.map.deser.std.StdValueInstantiator._createFromStringFallbacks(StdValueInstantiator.java:379)上没有单字符串构造函数/工厂方法java:268)org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromString(BeanDeserializer.java:765)at 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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句