Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring AMQP头仅作为字符串返回_Java_Spring_Rabbitmq_Message_Amqp - Fatal编程技术网

Java Spring AMQP头仅作为字符串返回

Java Spring AMQP头仅作为字符串返回,java,spring,rabbitmq,message,amqp,Java,Spring,Rabbitmq,Message,Amqp,我正在使用JavaSpring和AMQP的2.0.0版本快照。我创建一条AMQP消息,然后发送它。在另一个服务中,我正确地接收到消息,除了header而不是receiving type Object之外,每个header都是String类型 发布者代码: Message responseMessage = MessageBuilder .withBody(SerializationUtils.serialize(person)) .setContentType(MessagePr

我正在使用JavaSpring和AMQP的2.0.0版本快照。我创建一条AMQP消息,然后发送它。在另一个服务中,我正确地接收到消息,除了header而不是receiving type 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");
当我运行上述代码时,我将在消费者代码的最后一行失败,错误为:无法将字符串转换为Pet。除了在消费者代码中收到的每一个标题都是字符串类型外,该消息都显示为ok

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

USAGE: Properties.getHeaders() returns Map<String,Object>
用法:MessageBuilder.setHeader(字符串键,对象值);
用法:Properties.getHeaders()返回映射

每个头都有字符串/对象类型的键/值对。我所做的工作还包括序列化一个我想传递非字符串/整数值的头,但这似乎不是头的要点。我遗漏了什么吗?

你告诉编译器你的
字符串真是个宠物。但是,
Pet
不是
字符串的一部分。有两种可能的解决方案:

解决方案1:确保宠物扩展字符串,如下所示:

public class Pet extends String {
    //...
}
然后您将能够将
字符串
投射到
宠物

解决方案2:实现一个
Pet
的构造函数,该构造函数将
字符串作为参数:

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

您需要将您的宠物序列化为字符串,并在另一个服务中获取它时对其进行反序列化。例如,您可以使用fasterxml Jackson并将其序列化为JSON字符串

其中明确表示我的“字符串”真的是宠物?我正在填充标题。标题只是一个映射条目。这个映射条目,这个键值对,类型为-key是字符串,值是OBJECT。--,标题。放置(“MyNewPet”,myDog);--但另一方面,当我从标题中拉出时,突然地图变成了-对象发生了什么事?它在哪里明确地说我的“字符串”真的是宠物?我正在填充标题。标题只是一个映射条目。这个映射条目,这个键值对,类型为-key是字符串,值是OBJECT。--,标题。放置(“MyNewPet”,myDog);--但在另一方面,当我从标题中取出时,突然映射现在是-对象发生了什么?我猜这是因为amqp没有将对象序列化为字节,很可能它只是调用toString()并通过代理传递字符串。据我所知,这些队列只传递字符串