Spring JMS: 如何在发送和接收Java 对象时拦截结果JSON 转换?

Spring JMS: how intercept the result JSON transformation when a Java object is sent and received?

我有一个 Spring 应用程序使用 JMS (ActiveMQ) 并发送两种类型的消息。

关于后一种消息传递方法,sender/receiver 与为 json

配置的 MessageConverter 一起工作

在此之前,该应用程序运行良好。

我需要的是一种在发送和接收数据时获取和打印 json 数据的方法。

因此:

当然,转换过程会在内部自动发生,但出于报告目的,我需要发送和接收的 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]