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);