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

时间:2013-12-04 15:03:26

标签: java spring spring-mvc websocket spring-4

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

我正在注射SimpMessageSendingOperations并致电convertAndSend。我不是肯定的,但我很确定我得到的SimpMessagingTemplate(它实现SimpMessageSendingOperations)包含setMessageConverter。此方法需要MessageConverter并且有一个MappingJackson2MessageConverter类,但当然它使用它自己的内部ObjectMapper,无法重新定义。

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

这似乎可行,但也比我预期的更多参与。我忽略了什么吗?

2 个答案:

答案 0 :(得分:3)

看起来可行,但在Spring 4.0.1中会更容易

请参阅 - https://jira.springsource.org/browse/SPR-11184

从上面的错误报告中引用。

  

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

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

答案 1 :(得分:0)

如今,您可以这样做:

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