Spring JMS: 如何在发送和接收Java 对象时拦截结果JSON 转换?
Spring JMS: how intercept the result JSON transformation when a Java object is sent and received?
我有一个 Spring 应用程序使用 JMS
(ActiveMQ
) 并发送两种类型的消息。
Java
实现 Serializable
的对象
json
关于后一种消息传递方法,sender/receiver 与为 json
配置的 MessageConverter
一起工作
在此之前,该应用程序运行良好。
我需要的是一种在发送和接收数据时获取和打印 json
数据的方法。
因此:
- 发件人:使用Java对象->转换为json->打印json数据->发送json 数据
- 接收端:接收json数据->打印json数据->转换为Java对象->做业务逻辑
当然,转换过程会在内部自动发生,但出于报告目的,我需要发送和接收的 json 数据。目前,该应用程序只能 'directly' 发送和接收 Java 对象。
加粗部分怎么可能完成?
只需自己调用JSON消息转换器创建一个TextMessage
并在发送前打印;消费端也是一样,收到一条短信,打印出来,然后在你的代码中使用转换器转换成对象。
编辑
另一种选择是将转换器子类化并进行日志记录 after/before 转换。
编辑
这是一个例子:
@SpringBootApplication
public class So51251864Application {
public static void main(String[] args) {
SpringApplication.run(So51251864Application.class, args);
}
@Bean
public ApplicationRunner runner(JmsTemplate template) {
return args -> template.convertAndSend("foo", new Foo("baz"));
}
@Bean
public MessageConverter converter() {
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter() {
@Override
public Message toMessage(Object object, Session session) throws JMSException, MessageConversionException {
TextMessage message = (TextMessage) super.toMessage(object, session);
System.out.println("outbound json: " + message.getText());
return message;
}
@Override
public Object fromMessage(Message message) throws JMSException, MessageConversionException {
System.out.println("inbound json: " + ((TextMessage) message).getText());
return super.fromMessage(message);
}
};
converter.setTargetType(MessageType.TEXT);
converter.setTypeIdPropertyName("type");
return converter;
}
@JmsListener(destination = "foo")
public void listen(Foo foo) {
System.out.println(foo);
}
public static class Foo {
private String bar;
public Foo() {
super();
}
public Foo(String bar) {
this.bar = bar;
}
public String getBar() {
return this.bar;
}
public void setBar(String bar) {
this.bar = bar;
}
@Override
public String toString() {
return "Foo [bar=" + this.bar + "]";
}
}
}
和
outbound json: {"bar":"baz"}
inbound json: {"bar":"baz"}
Foo [bar=baz]
我有一个 Spring 应用程序使用 JMS
(ActiveMQ
) 并发送两种类型的消息。
Java
实现Serializable
的对象json
关于后一种消息传递方法,sender/receiver 与为 json
MessageConverter
一起工作
在此之前,该应用程序运行良好。
我需要的是一种在发送和接收数据时获取和打印 json
数据的方法。
因此:
- 发件人:使用Java对象->转换为json->打印json数据->发送json 数据
- 接收端:接收json数据->打印json数据->转换为Java对象->做业务逻辑
当然,转换过程会在内部自动发生,但出于报告目的,我需要发送和接收的 json 数据。目前,该应用程序只能 'directly' 发送和接收 Java 对象。
加粗部分怎么可能完成?
只需自己调用JSON消息转换器创建一个TextMessage
并在发送前打印;消费端也是一样,收到一条短信,打印出来,然后在你的代码中使用转换器转换成对象。
编辑
另一种选择是将转换器子类化并进行日志记录 after/before 转换。
编辑
这是一个例子:
@SpringBootApplication
public class So51251864Application {
public static void main(String[] args) {
SpringApplication.run(So51251864Application.class, args);
}
@Bean
public ApplicationRunner runner(JmsTemplate template) {
return args -> template.convertAndSend("foo", new Foo("baz"));
}
@Bean
public MessageConverter converter() {
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter() {
@Override
public Message toMessage(Object object, Session session) throws JMSException, MessageConversionException {
TextMessage message = (TextMessage) super.toMessage(object, session);
System.out.println("outbound json: " + message.getText());
return message;
}
@Override
public Object fromMessage(Message message) throws JMSException, MessageConversionException {
System.out.println("inbound json: " + ((TextMessage) message).getText());
return super.fromMessage(message);
}
};
converter.setTargetType(MessageType.TEXT);
converter.setTypeIdPropertyName("type");
return converter;
}
@JmsListener(destination = "foo")
public void listen(Foo foo) {
System.out.println(foo);
}
public static class Foo {
private String bar;
public Foo() {
super();
}
public Foo(String bar) {
this.bar = bar;
}
public String getBar() {
return this.bar;
}
public void setBar(String bar) {
this.bar = bar;
}
@Override
public String toString() {
return "Foo [bar=" + this.bar + "]";
}
}
}
和
outbound json: {"bar":"baz"}
inbound json: {"bar":"baz"}
Foo [bar=baz]