Spring AMQP Headers仅作为String返回

时间:2016-09-15 06:57:15

标签: java spring rabbitmq message amqp

我正在使用Java Spring和AMQP的2.0.0版快照。我创建一个AMQP消息,发送它。在另一个服务中,我正确地接收消息,除了头而不是接收类型Object,每个头都是String类型。

发布商代码:

Message responseMessage = MessageBuilder
    .withBody(SerializationUtils.serialize(person))
    .setContentType(MessageProperties.CONTENT_TYPE_SERIALIZED_OBJECT)
    .setHeader("STUDENT_TYPE", "New") // Not part of person object but related
    .setHeader("PET", getPet()) // This is a pet object
    .build();
rabbitTemplate.send(responseMessage);

消费者代码:

Object messageBody = SerializationUtils.deserialize(amqpMessage.getBody());
Person person = (Person)messageBody;
MessageProperties properties = amqpMessage.getMessageProperties();
String type = properties.getHeaders().get("STUDENT_TYPE").toString();
Pet pet = (Pet)properties.getHeaders().get("PET");

当我运行上面的代码时,我将在消费者代码的最后一行失败并出现错误:无法将String转换为Pet。消息传递正常,但消费者代码中收到的每个标头都是String类型。

USAGE: MessageBuilder.setHeader(String Key, Object Value);

USAGE: Properties.getHeaders() returns Map<String,Object>

每个标头都有String / Object类型的键/值对。我已经到位的工作也是序列化我希望传递非字符串/整数值的标题,但这似乎是除了标题之外的点。我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

您需要将Pet序列化为字符串,并在其他服务中将其反序列化。例如。你可以使用speedxml Jackson并将其序列化为JSON字符串

答案 1 :(得分:0)

您告诉编译器您的String确实是宠物。但是,Pet不是String的{​​{3}}。有两种可能的解决方案:

解决方案1:确保Pet extends String,如下所示:

public class Pet extends String {
    //...
}

然后您就可以将String投射到Pet

解决方案2:您实现Pet的构造函数,该构造函数将String作为参数:

public class Pet {
    //...
    Public Pet(String name) {
        //...
    }
    //...
}