Michel Néron
Michel Néron

Reputation: 63

SpringBoot WebMvcConfigurationSupport didn't take configureMessageConverters when we get bean in

In WebMvcConfigurationSupport child class we override the method configureMessageConverters.

When we get one converters like a bean,

@Bean
public HttpMessageConverter mappingJackson2HttpMessageConverter(){
    MappingJackson2HttpMessageConverter jacksonConverter =
            new MappingJackson2HttpMessageConverter(new EventServiceObjectMapper());

    return jacksonConverter;
}

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(new Jaxb2RootElementHttpMessageConverter());
    converters.add(mappingJackson2HttpMessageConverter());
}

the configuration-loader didn't take our converters.

But when we declare all in the method, the configuration-loader take our converters.

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(new Jaxb2RootElementHttpMessageConverter());
    converters.add(new MappingJackson2HttpMessageConverter(new EventServiceObjectMapper()));
}

It's normal? I miss something?

Dependencies ::

Spring webmvc 4.3.22.RELEASE

SpringBoot 1.5.19.RELEASE

Upvotes: 1

Views: 1780

Answers (2)

Neo Pham
Neo Pham

Reputation: 372

I was struggle with WebMVC and RestAPI. Once @EnableWebMvc, it will override spring.jackson.* config.

My solution, get current MappingJackson2HttpMessageConverter and custom it that I want.

@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {
    private ObjectMapper mapper;

    @Autowired  // spring.jackson.* ObjectMapper's config
    public WebConfig(ObjectMapper mapper) {
        this.mapper = mapper;
    }

    @Override
    public void extendMessageConverters (List<HttpMessageConverter<?>> converters) {
        converters.stream()
                .filter(x -> x instanceof  MappingJackson2HttpMessageConverter)
                .forEach(x -> ((MappingJackson2HttpMessageConverter) x).setObjectMapper(mapper));
    }
}

Upvotes: 1

Michel N&#233;ron
Michel N&#233;ron

Reputation: 63

I found one solution. Extends the WebMvcConfigurerAdapter, and implements extendMessageConverters, clear the converters and set only converters I want.

@Bean
public HttpMessageConverter mappingJackson2HttpMessageConverter(){
    MappingJackson2HttpMessageConverter jacksonConverter =
            new MappingJackson2HttpMessageConverter(new EventServiceObjectMapper());

    return jacksonConverter;
}

@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.clear();
    converters.add(new Jaxb2RootElementHttpMessageConverter());
    converters.add(mappingJackson2HttpMessageConverter());
}

Upvotes: 0

Related Questions