使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)