Tomer
Tomer

Reputation: 630

Using HttpMessageConverter causes HTTP 406

After extensive investigations, I wanted to share the problem and the resolution.

Problem

I have a RestController that works well, as long as I'm in charge of converting the JSON message. The moment I try to use an HttpMessageConverter to make the conversion more elegant, the client will start receiving HTTP 406.

So this works:

@RequestMapping(value = "/objects", method = RequestMethod.GET)
public Map<String, Object>[] getObjects(@RequestBody Object jsonQuery) {
    MyQuery query = new MyConverter().convert(jsonQuery);
    // do something with query
}

But, when I configure the converter, like this:

@Configuration
@EnableWebMvc
@ComponentScan
public class WebConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> httpMessageConverters) {
        httpMessageConverters.add(new QueryMessageConverter(new MediaType("application", "json")));
    }
}

This causes HTTP 406:

@RequestMapping(value = "/objects", method = RequestMethod.GET)
public Map<String, Object>[] getObjects(@RequestBody Query Query) {
    // do something with query
}

My pom.xml only refers spring-boot, and doesn't mention jackson at all.

Solution

See below

Upvotes: 1

Views: 273

Answers (1)

Tomer
Tomer

Reputation: 630

The solution is really very simple, and it is to register the jackson handler explicitly:

@Configuration
@EnableWebMvc
@ComponentScan
public class WebConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> httpMessageConverters) {
        httpMessageConverters.add(new QueryMessageConverter(new MediaType("application", "json")));
        httpMessageConverters.add(new MappingJackson2HttpMessageConverter());
    }
}

Upvotes: 1

Related Questions