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
不是 String
的 subclass。有两种可能的解决方案:
解决方案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
我正在使用 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
不是 String
的 subclass。有两种可能的解决方案:
解决方案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