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

时间:2018-07-09 18:24:29

标签: jms spring-jms

我有一个使用JMSActiveMQ)的Spring App,并发送两种类型的消息。

  • Java对象,实现了Serializable
  • json

关于后一种消息传递方法,发送者/接收者使用为MessageConverter配置的json

直到这里应用程序都能正常工作。

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

因此:

  • 发件人:使用Java对象->转换为json-> 打印json数据->发送json数据
  • 接收器:接收json数据-> 打印json数据->转换为Java对象->做业务逻辑

当然,转换过程自动在内部进行,但是出于报告目的,我需要发送和接收json数据。目前,该应用只能在发送和接收Java对象时“直接”运行。

如何完成粗体部分?

1 个答案:

答案 0 :(得分:1)

只需自己调用JSON消息转换器来创建一个TextMessage并在发送之前将其打印出来;在使用方,同样的事情,接收一条短信,打印出来,然后使用代码中的转换器将其转换为对象。

编辑

另一种选择是将转换器子类化,并在转换之后/之前进行日志记录。

编辑

这是一个例子:

@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]