我正在使用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类型的键/值对。我已经到位的工作也是序列化我希望传递非字符串/整数值的标题,但这似乎是除了标题之外的点。我错过了什么吗?
答案 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) {
//...
}
//...
}