Skip to content

Ordering of MessageConverters in AbstractMessageBrokerConfiguration [SPR-11961] #16577

@spring-projects-issues

Description

@spring-projects-issues

Adam Granger opened SPR-11961 and commented

I wish to have a controller with like this, which returns an already-encoded JSON String.

@Controller
public class FooController {

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

However this is picked up by Jackson and escaped. e.g. {"foo":123} becomes {"foo":123}. Does it ever make sense to escape a single String as JSON, surely at the top level JSON can only ever start with an object or an array? See http://www.ietf.org/rfc/rfc4627.txt

The ordering is specified in AbstractMessageBrokerConfiguration#brokerMessageConverter() puts Jackson before String and ByteArray converters

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());
}

I can provide my own via WebSocketMessageBrokerConfigurer, however I believe that the out-of-the-box ordering in brokerMessageConverter() should be changed to the following:

if (registerDefaults) {
    converters.add(new StringMessageConverter()); // do before Jackson!
    if (jackson2Present) {
        DefaultContentTypeResolver resolver = new DefaultContentTypeResolver();
        resolver.setDefaultMimeType(MimeTypeUtils.APPLICATION_JSON);
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        converter.setContentTypeResolver(resolver);
        converters.add(converter);
    }
    converters.add(new ByteArrayMessageConverter());
}

Affects: 4.0.4

Referenced from: commits 670c216

Metadata

Metadata

Assignees

Labels

in: webIssues in web modules (web, webmvc, webflux, websocket)type: enhancementA general enhancement

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions