使用 STOMP/WebSockets/Spring 从 @SubscribeMapping 返回原始字符串

Posted

技术标签:

【中文标题】使用 STOMP/WebSockets/Spring 从 @SubscribeMapping 返回原始字符串【英文标题】:Return raw strings from @SubscribeMapping with STOMP/WebSockets/Spring 【发布时间】:2014-07-04 12:42:22 【问题描述】:

我有一个使用 STOMP over websockets 的 Spring-MVC 控制器。除了订阅时在我的 STOMP javascript 客户端中收到的字符串之外,一切都正常工作,可能是由 Spring 转义的。

我可以在网上和官方文档中找到的所有示例都使用 POJO 作为返回类型,然后自动使用 Jackson JSON 转换 - 我不希望这样,因为我返回的 JSON 完全是动态的 - 我该如何切换废话,所以我可以只返回一个纯字符串!?

@Controller
public class FooController 

    @SubscribeMapping("/foo")
    public String getUser()  
        String json = customJsonConversion();
        return json;
    

如果 customJsonConversion 的输出是 "x":1

【问题讨论】:

【参考方案1】:

您似乎想禁用杰克逊转换。默认注册AbstractMessageBrokerConfiguration#brokerMessageConverter()

if (registerDefaults) 
    if (jackson2Present) 
        DefaultContentTypeResolver resolver = new DefaultContentTypeResolver();
        resolver.setDefaultMimeType(MimeTypeUtils.APPLICATION_JSON);
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        converter.setContentTypeResolver(resolver);
        converters.add(converter);
    
    converters.add(new StringMessageConverter());
    converters.add(new ByteArrayMessageConverter());

要禁用它,您应该在您的自定义 WebSocketMessageBrokerConfigurer 中执行此操作:

public boolean configureMessageConverters(List<MessageConverter> messageConverters) 
   messageConverters.add(new StringMessageConverter());
   messageConverters.add(new ByteArrayMessageConverter());
   return false;

【讨论】:

谢谢。理想情况下,我想与一些使用原始 JSON 的控制器和其他使用 POJO 的控制器混合和匹配,遗憾的是它们没有让注释级别的配置变得更容易 再看一下,似乎 messageconverters 的工作方式,即通过 isSupported() 检查,StringMessageConverter 无论如何都应该在 Jackson 转换器之前,然后你一起支持 raw 和 jackson。 SPR-11961 现在计划用于 4.1。关于混合和匹配,我们可以考虑内容类型的方法级控制(例如@SubscribeMapping 上的属性)。获得一个我们可以考虑的请求,其中包含您想到的一两个场景的更多细节,这将很有用。

以上是关于使用 STOMP/WebSockets/Spring 从 @SubscribeMapping 返回原始字符串的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)