代码之家  ›  专栏  ›  技术社区  ›  Aerith

弹簧AMQP头仅作为字符串返回

  •  2
  • Aerith  · 技术社区  · 8 年前

    我将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");
    

    当我运行上述代码时,我将在消费者代码的最后一行失败,并显示错误:Cannot cast String to Pet。消息显示正常,但在消费者代码中接收到的每个头都是String类型。

    USAGE: MessageBuilder.setHeader(String Key, Object Value);
    
    USAGE: Properties.getHeaders() returns Map<String,Object>
    

    每个头都有类型为String/Object的键/值对。我所做的工作还包括序列化一个我想为其传递非字符串/整数值的标头,但这似乎是在标头的点之外。我错过了什么吗?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Yuri Plevako    8 年前

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

        2
  •  0
  •   Lajos Arpad    8 年前

    您正在告诉编译器您的 String 真的是一只宠物。然而 Pet 不是 subclass 属于 一串 有两种可能的解决方案:

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

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

    然后你就可以 一串 进入 宠物 .

    解决方案2:实现 宠物 这需要一个 一串 作为参数:

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