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

Java Spring 4中WebSocket的自定义对象映射器,java,spring,spring-mvc,websocket,spring-4,Java,Spring,Spring Mvc,Websocket,Spring 4,我正在使用Spring4,并遵循关于在Spring中使用WebSocket的说明。我能够让一切正常工作,但我不确定在发送application/json时使用自定义对象映射器的最佳方式是什么 我正在注入一个SimpMessageSendingOperations并调用convertAndSend。我不确定,但我很确定我得到的是一个SimpMessageTemplate(它实现了SimpMessageSendingOperations),其中包含一个setMessageConverter。此方法采

我正在使用Spring4,并遵循关于在Spring中使用WebSocket的说明。我能够让一切正常工作,但我不确定在发送
application/json
时使用自定义对象映射器的最佳方式是什么

我正在注入一个
SimpMessageSendingOperations
并调用
convertAndSend
。我不确定,但我很确定我得到的是一个
SimpMessageTemplate
(它实现了
SimpMessageSendingOperations
),其中包含一个
setMessageConverter
。此方法采用
MessageConverter
,并且有一个
MappingJackson2MessageConverter
类,但当然它使用自己的内部
ObjectMapper
,无法重新定义

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


这似乎是可行的,但也比我想象的要复杂得多。我忽略了什么吗?

看起来这是可能的,但在Spring4.0.1中会变得更容易

见-

引用上面的bug报告

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

  • 删除注释
  • 扩展WebSocketMessageBrokerConfiguration支持,而不是实现WebSocketMessageBrokerConfiguration
  • 重写brokerMessageConverter()方法,并记住在重写方法中保留@Bean

  • 现在你可以这样做:

    @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;
        }
    
        ...
    }
    
    @配置
    @EnableWebSocketMessageBroker
    公共类WebSocketConfig实现WebSocketMessageBrokerConfiger{
    @凌驾
    公共布尔配置messageConverters(列出messageConverters){
    MappingJackson2MessageConverter=新的MappingJackson2MessageConverter();
    //避免创建具有相同配置的多个ObjectMapper。
    setObjectMapper(getMyCustomObjectMapper());
    messageConverters.add(converter);
    //不要添加默认转换器。
    返回false;
    }
    ...
    }
    
    不幸的是,
    ObjectMapper
    不能直接提供给
    MappingJackson2MessageConverter
    的构造函数,这意味着它将首先创建一个无用的ObjectMapper