Spring 4 中 Websockets 的自定义对象映射器

Posted

技术标签:

【中文标题】Spring 4 中 Websockets 的自定义对象映射器【英文标题】:Custom object mapper for Websockets in Spring 4 【发布时间】:2013-12-04 15:03:26 【问题描述】:

我正在使用 Spring 4,并且正在关注 Rossen Stoyanchev's blog post 关于在 Spring 中使用 websockets 的信息。我能够让一切正常工作,但我不确定在发送 application/json 时使用自定义对象映射器的最佳方式是什么。

我正在注入 SimpMessageSendingOperations 并调用 convertAndSend。我不是很肯定,但我很确定我得到了一个包含setMessageConverterSimpMessagingTemplate(它实现了SimpMessageSendingOperations)。这个方法需要一个MessageConverter 并且有一个MappingJackson2MessageConverter 类,但当然它使用它自己的内部ObjectMapper,它不能被重新定义。

所以看起来我要做的就是创建一个自定义MessageConverter 并在其中定义我的自定义ObjectMapper,这样我就可以将它传递给SimpMessagingTemplate 的实例,然后我可以将其注入到我的类中。

这似乎可行,但也比我预期的要复杂。我忽略了什么吗?

【问题讨论】:

【参考方案1】:

看起来有可能,但在 Spring 4.0.1 中会变得更容易

见 - https://jira.springsource.org/browse/SPR-11184

引用上面的错误报告。

同时,通过@EnableWebSocketMessageBroker 设置,您可以:

    删除注释 扩展 WebSocketMessageBrokerConfigurationSupport 而不是实现 WebSocketMessageBrokerConfigurer 覆盖 brokerMessageConverter() 方法并记住将 @Bean 保留在覆盖方法中

【讨论】:

【参考方案2】:

现在你可以这样做:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer 

    @Override
    public boolean configureMessageConverters(List<MessageConverter> messageConverters) 
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        // Avoid creating many ObjectMappers which have the same configuration.
        converter.setObjectMapper(getMyCustomObjectMapper());
        messageConverters.add(converter);

        // Don't add default converters.
        return false;
    

    ...

很遗憾,ObjectMapper 不能直接提供给MappingJackson2MessageConverter 的构造函数,这意味着它将首先创建一个无用的 ObjectMapper。

【讨论】:

以上是关于Spring 4 中 Websockets 的自定义对象映射器的主要内容,如果未能解决你的问题,请参考以下文章

Spring 4 STOMP Websockets Heartbeat

在调用处理程序之前使用 Tomcat 8 和 Spring 4 ClassCastException 的 websockets

对如何使用 Spring-websockets 进行 stomp 调用感到困惑

Spring with STOMP over SockJS 和 Tomcat 未升级到 Websockets

Spring、Camel、ActiveMQ 和 WebSockets

Spring中用于websockets测试的MockHttpServletRequestBuilder的等价物是啥