2015-09-01 5 views
4

Я собрал тест java. Он помещает сообщение в очередь и возвращает его как строку. То, что я пытаюсь достичь, - это преобразовать его в java-объект SignUpDto. Я поставил перед собой вопрос как можно больше вопросов.rabbitmq потребляет сообщение json и преобразовывается в объект Java

Вопрос:

Как изменить ниже тест, чтобы преобразовать в объект?


SignUpClass

public class SignUpDto { 
    private String customerName; 
    private String isoCountryCode; 
    ... etc 
} 

Применение - Config класса

@Configuration 
public class Application { 

    @Bean 
    public ConnectionFactory connectionFactory() { 
     return new CachingConnectionFactory("localhost"); 
    } 

    @Bean 
    public AmqpAdmin amqpAdmin() { 
     return new RabbitAdmin(connectionFactory()); 
    } 

    @Bean 
    public RabbitTemplate rabbitTemplate() { 

     // updated with @GaryRussels feedback 
     RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory()); 
     rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter()); 
     return rabbitTemplate; 
    } 

    @Bean 
    public Queue myQueue() { 
     return new Queue("myqueue"); 
    } 
} 

Тест

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {Application.class}) 
public class TestQueue { 

    @Test 
    public void convertMessageIntoObject(){ 

     ApplicationContext context = new AnnotationConfigApplicationContext(Application.class); 
     AmqpTemplate template = context.getBean(AmqpTemplate.class); 

     String jsonString = "{ \"customerName\": \"TestName\", \"isoCountryCode\": \"UK\" }"; 

     template.convertAndSend("myqueue", jsonString); 

     String foo = (String) template.receiveAndConvert("myqueue"); 

     // this works ok  
     System.out.println(foo); 

     // How do I make this convert 
     //SignUpDto objFoo = (SignUpDto) template.receiveAndConvert("myqueue"); 
     // objFoo.toString() 

    } 
} 

ответ

6

Настройте RabbitTemplate на Jackson2JsonMessageConverter.

Затем используйте

template.convertAndSend("myqueue", myDto); 

... 

SignUpDto out = (SignUpDto) template.receiveAndConvert("myQueue"); 

Обратите внимание, что преобразование исходящих устанавливает тип контента (приложения/JSON) и заголовки с информацией о типе, который сообщает принимающему конвертер, какой тип объекта для создания.

Если вы действительно хотите отправить простую строку JSON, вам необходимо установить тип контента application/json. Чтобы помочь входящему преобразованию, вы можете либо установить заголовки типов (посмотреть источник конверта для информации), либо настроить преобразователь с помощью ClassMapper, чтобы определить тип.

EDIT

<rabbit:template id="amqpTemplate" connection-factory="connectionFactory" 
     message-converter="json" /> 

<bean id="json" 
class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter" /> 

Или, так как вы используете Java Config; просто вставьте его в определение шаблона.

EDIT2

Если вы хотите отправить обычную строку JSON; вам нужно помочь входящему конвертеру через заголовки.

Чтобы установить заголовки ...

template.convertAndSend("", "myQueue", jsonString, new MessagePostProcessor() { 

    @Override 
    public Message postProcessMessage(Message message) throws AmqpException { 
     message.getMessageProperties().setContentType("application/json"); 
     message.getMessageProperties().getHeaders() 
      .put(AbstractJavaTypeMapper.DEFAULT_CLASSID_FIELD_NAME, "foo.SignUpDto"); 
     return message; 
    } 
}); 

Имейте в виду, однако, что это отправка шаблон должен НЕ есть JSON сообщение конвертер (пусть по умолчанию для SimpleMessageConverter). В противном случае JSON будет дважды закодирован.

+0

Как настроить RabbitTemplate с помощью Jackson2JsonMessageConverter? –

+0

См. Отредактированный ответ. –

+0

Я не уверен, как этот xml отображает конфигурацию java? –