Search code examples
spring-mvcspring-websocket

Return raw strings from @SubscribeMapping with STOMP/WebSockets/Spring


I've got a Spring-MVC controller using STOMP over websockets. Everything works fine apart from the String received in my STOMP JavaScript client upon subscription has been escaped, presumably by Spring.

All the examples I can find on the web and in official documentation uses POJOs for the return types and then uses Jackson JSON conversion auto-magically - I do not want this as the JSON I return is entirely dynamic - how do I switch this nonsense off so I can just return a plain string!?

@Controller
public class FooController {

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

JSON received looks is in this form "{\"x\":1}" if output of customJsonConversion is {"x":1}


Solution

  • Looks like you want to disable Jackson conversion. It is registered by default 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());
    }
    

    To disable that you should do this in your custom WebSocketMessageBrokerConfigurer:

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