2016-09-15 12 views
2

バージョン2.0.0のJava Springを使用しています。AMQPのスナップショット。 AMQPメッセージを作成して送信します。別のサービスでは、メッセージを正しく受け取っていますが、Typeオブジェクトを受け取る代わりにヘッダーを除いて、すべてのヘッダーはString型です。Spring AMQPヘッダーは文字列として返されます

出版社コード:

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型であることを除いて、okになります。

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

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

すべてのヘッダーにString/Object型のキーと値のペアがあります。私の周りの仕事は、私は非文字列/整数値を渡したいヘッダーをシリアル化していますが、これはヘッダーのポイント以外にあるようです。何か不足していますか?

答えて

1

:あなたは、パラメータとしてStringを取るPetのコンストラクタを実装します。例えば。 fasterxml Jacksonを使用してJSON文字列にシリアライズすることができます

+0

私の "String"は本当にペットなのですか?私はヘッダを設定しています。ヘッダーは単なるマップエントリです。このマップエントリは、このキー値のペアで、タイプはKEYでSTRING、VALUEはOBJECTです。 - 、headers.put( "MyNewPet"、myDog); - しかし、もう一方の側では、ヘッダーを抜いて、突然マップがになっています - オブジェクトには何が起こったのですか? – Aerith

+0

amqpはあなたのオブジェクトをバイト列にシリアライズしないので、おそらくtoString()を呼び出してブローカーを通して文字列を渡す可能性が高いです。私が知っている限り、これらのキューは文字列だけを渡します –

0

コンパイラにあなたのStringが本当にペットであると伝えています。ただし、Petは、subclassStringではありません。

解決法1:

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

をして、あなたがPetStringをキャストすることができます:あなたはこのように、必ずPet extends Stringを作る2つの解決策があります。

対処方法2:あなたは、文字列にあなたのペットをシリアル化し、あなたが別のサービスでそれを得るとき、それをデシリアライズする必要が

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

「String」は本当にペットなのですか?私はヘッダを設定しています。ヘッダーは単なるマップエントリです。このマップエントリは、このキー値のペアで、タイプはKEYでSTRING、VALUEはOBJECTです。 - 、headers.put( "MyNewPet"、myDog); - しかし、もう一方の側では、ヘッダーを抜いて、突然マップがになっています - オブジェクトには何が起こったのですか? – Aerith

関連する問題