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
。我不是很肯定,但我很确定我得到了一个包含setMessageConverter
的SimpMessagingTemplate
(它实现了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