Spring AMQP Headers 仅作为字符串返回

Spring AMQP Headers are returned as String only

我正在使用 Java Spring 和 2.0.0 版本的 AMQP 快照。我创建一个 AMQP 消息,发送它。在另一项服务中,我正确接收消息,除了 headers 而不是接收类型 Object,每个 header 都是 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。消息没有问题,除了在消费者代码中接收到的每个 header 都是 String 类型。

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

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

每个 header 都有 key/value 对类型 String/Object。我现有的解决方法也是序列化一个 header 我想为其传递 non-string/integer 值,但这似乎与 header 无关。我错过了什么吗?

您是在告诉编译器您的 String 确实是一只宠物。但是,Pet 不是 Stringsubclass。有两种可能的解决方案:

解决方案1:你确保Pet extends String,像这样:

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

然后你就可以将 String 转换为 Pet.

解决方案 2:实现 Pet 的构造函数,它以 String 作为参数:

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

你需要将你的Pet序列化为字符串,在其他服务中获取到的时候反序列化。例如。您可以使用 fasterxml Jackson 并将其序列化为 JSON string