代码之家  ›  专栏  ›  技术社区  ›  Manuel Jordan

spring jms:如何在发送和接收java对象时拦截结果json转换?

  •  0
  • Manuel Jordan  · 技术社区  · 8 年前

    我有一个spring应用程序 JMS ( ActiveMQ )以及发送两种类型的消息。

    • Java 实现的对象 Serializable
    • json

    关于后一种消息传递方法,发送方/接收方使用 MessageConverter 配置用于 JSON格式

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

    我需要的是一种获取和打印 JSON格式 发送和接收时的数据。

    因此:

    • 发件人:使用Java对象->转换为JSON-> 打印JSON数据 ->发送JSON数据
    • 接收方:接收JSON数据-> 打印JSON数据 ->转换为Java对象->执行业务逻辑

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

    怎样才能完成大胆的部分?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Gary Russell    8 年前

    只需自己调用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]