2016-09-15 7 views
2

버전 2.0.0의 Java Spring을 사용하고 있습니다. AMQP의 스냅 샷. AMQP 메시지를 작성하여 보냅니다. 다른 서비스에서는 Object를받는 대신 머리글을 제외하고 올바르게 메시지를받습니다. 모든 헤더는 String 유형입니다.스프링 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 유형 인 것을 제외하고는 메시지가 정상적으로 나타납니다.

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

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

모든 헤더에는 String/Object 유형의 키/값 쌍이 있습니다. 내가 가지고있는 주위의 작업은 또한 비 문자열/정수 값을 전달하고 싶습니다 헤더를 serialize하는 것입니다,하지만 이것은 헤더의 포인트 외의 것으로 보인다. 내가 놓친 게 있니?

답변

1

당신은 문자열로 당신의 애완 동물을 직렬화 할 필요가, 그리고 다른 서비스를받을 때를 역 직렬화. 예 : 당신은 fasterxml Jackson을 사용하여 JSON 문자열에 직렬화합니다.

+0

"String"이 실제로 애완 동물이라고 명시하는 곳은 어디입니까? 머리글을 채우고 있습니다. 헤더는 단순히지도 항목입니다. 이 맵 항목 (이 키 값 쌍)은 - KEY 유형이 STRING이고 VALUE가 OBJECT입니다. - , headers.put ("MyNewPet", myDog); -하지만 다른면에서 헤더에서 빠져 나오면 갑자기 Map이 가됩니다 - 오브젝트에 무슨 일이 일어 났습니까? – Aerith

+0

아마 amqp가 당신의 객체를 바이트로 직렬화하지 않기 때문일 것입니다. 아마도 가장 많이 사용되는 것은 toString()을 호출하고 브로커를 통해 문자열을 전달하기 때문일 것입니다. 내가 아는 한이 대기열은 문자열 만 전달합니다. –

0

컴파일러에게 String은 실제로 애완 동물이라고 말하고 있습니다. 그러나 PetsubclassString이 아닙니다.

Solution1 : 이런 식으로, 당신은 확실히 Pet extends String합니다

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

을 그리고 당신은 PetString을 시전 할 수있을 것 두 가지 가능한 솔루션입니다.

Solution2 : 당신은 매개 변수로 String 소요 Pet의 생성자 구현 :

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

"String"이 실제로 애완 동물이라는 것을 명시하는 곳은 어디입니까? 머리글을 채우고 있습니다. 헤더는 단순히지도 항목입니다. 이 맵 항목 (이 키 값 쌍)은 - KEY 유형이 STRING이고 VALUE가 OBJECT입니다. - , headers.put ("MyNewPet", myDog); -하지만 다른면에서 헤더에서 빠져 나오면 갑자기 Map이 가됩니다 - 오브젝트에 무슨 일이 일어 났습니까? – Aerith