gpt4 book ai didi

java - rabbitmq 消费 json 消息并转换成 Java 对象

转载 作者:行者123 更新时间:2023-12-04 14:26:09 25 4
gpt4 key购买 nike

我已经整理了一个java测试。它将消息放入队列并将其作为字符串返回。我试图实现的是将它转换为 java 对象 SignUpDto。我已经尽可能地简化了这个问题的代码。

问题:

如何修改下面的测试以转换为对象?

注册类

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

应用程序 - 配置类
@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()

}
}

最佳答案

配置RabbitTemplateJackson2JsonMessageConverter .

然后使用

template.convertAndSend("myqueue", myDto);

...

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

请注意,出站转换设置内容类型(应用程序/json)和带有类型信息的 header ,这些信息告诉接收转换器要创建什么对象类型。

如果你真的想发送一个简单的 JSON 字符串,你需要将内容类型设置为 application/json .为了帮助入站转换,您可以设置类型 header (查看转换器源以获取信息),或者您可以使用 ClassMapper 配置转换器来确定类型。

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

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

或者,因为您使用的是 Java Config;只需将一个注入(inject)到您的模板定义中。

编辑2

如果你想发送一个纯 JSON 字符串;您需要通过 header 帮助入站转换器。

要设置标题...
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 将被双重编码。

关于java - rabbitmq 消费 json 消息并转换成 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32330909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com