【发布时间】:2026-02-03 11:10:02
【问题描述】:
Spring 启动应用程序
在 build.gradle 中:
implementation 'com.google.code.gson:gson:2.7'
这里是 JMS 配置:
import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.support.converter.MappingJackson2MessageConverter;
import org.springframework.jms.support.converter.MessageConverter;
import org.springframework.jms.support.converter.MessageType;
@Configuration
@ComponentScan(basePackages = "ru.otus.software_architect.eshop")
public class JMSConfiguration {
@Bean
public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory,
DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
// This provides all boot's default to this factory, including the message converter
configurer.configure(factory, connectionFactory);
// You could still override some of Boot's default if necessary.
return factory;
}
@Bean
public MessageConverter jacksonJmsMessageConverter() {
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
converter.setTargetType(MessageType.TEXT);
converter.setTypeIdPropertyName("_type");
return converter;
}
}
这里我如何向 ActiviveMQ 发送消息:
private void sendMessageToMessageBroker(NotifyActionEnum action, int orderId) {
JsonObject json = new JsonObject();
json.addProperty("email", UserService.getCurrentUserName());
json.addProperty("action", action.name().toLowerCase());
json.addProperty("orderId", orderId);
JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);
String message = json.toString();
jmsTemplate.convertAndSend(ESHOP_QUEUE, message);
logger.info("sendMessageToMessageBroker: success_sent_message_to_MB: " + message);
}
在日志中:
success_sent_message_to_MB:
{"email":"someemail@email.com","action":"order_update","orderId":14}
不错。
但在我的队列中的 ActiveMQ 上,消息如下所示:
"{\"email\":\"a_subscriber@mail.ru\",\"action\":\"order_update\",\"orderId\":4,\"createdAt\":\"2020-09-13T11:32:09.976+0300\"}"
这里截图:
然后我开始我的另一个应用程序(消费者)。当尝试从 json 获取日期时它被破坏了:
JsonElement messageJson = GsonUtil.parser.parse(message);
String action = messageJson.getAsJsonObject().get("action").getAsString(); // here broken
我收到错误消息:
Caused by: java.lang.IllegalStateException: Not a JSON Object: "{\"email\":\"a_subscriber@mail.ru\",\"action\":\"order_update\",\"orderId\":4,\"createdAt\":\"2020-09-13T11:32:09.976+0300\"}"
如何避免字符串中的“\”?
我需要排队成为下一个字符串:
{"email":"someemail@email.com","action":"order_update","orderId":14}
【问题讨论】:
-
某事将字符串放在双引号中,需要转义字符串中的双引号才能正常工作。
-
@Steve 为什么在队列中显示带有 \" 的字符串?
-
我的猜测是因为字符串开头和结尾的引号。无论添加这些引号的机制如何,都会通过在每个引号前面放置“\”来转义字符串中间的引号。为什么会这样,我不知道。
-
您为您的
JmsTemplate配置了什么MessageConverter?您是否使用将String转换为javax.jms.TextMessage的默认SimpleMessageConverter? -
@JustinBertram 我更新了我的帖子
标签: spring-boot gson activemq