Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

305
Vistas
Registering a custom MessageConverter in Spring Boot

I want to consume a RESTful service that returns text/javascript content type.

Since there is no OOTB HttpMessageConverter which can do this in Spring Boot, I want to register a custom converter.

One way I found to do this is to customize the RestTemplate itself by modifying MappingJackson2HttpMessageConverter:

@Component
public class CustomRestTemplateProvider {
    public RestTemplate getCustomRestTemplate(MediaType mediaType) {
        MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter();
        jacksonConverter.setSupportedMediaTypes(Collections.singletonList(mediaType));
        List<HttpMessageConverter<?>> converters = new ArrayList<>();
        converters.add(jacksonConverter);
        return new RestTemplate(converters);
    }
}

Then, in my service, just call getCustomRestTemplate(new MediaType("text", "javascript")

The above solution works fine but I also tried to create a new Converter which handles this one Media Type, according to the Spring Boot Documentation (27.1.2):

So I created a new Converter:

@Component
public class TextJavascriptMessageConverter extends AbstractJackson2HttpMessageConverter {

    public TextJavascriptMessageConverter(ObjectMapper objectMapper) {
        super(objectMapper);
        setTextJavascriptAsSupportedMediaType();
    }

    private void setTextJavascriptAsSupportedMediaType() {
        List<MediaType> supportedMediaTypes = new ArrayList<>();
        supportedMediaTypes.add(new MediaType("text", "javascript"));
        setSupportedMediaTypes(supportedMediaTypes);
    }
}

Then tried to register it like in the documentation:

@Configuration
public class ApplicationConfiguration {

    @Bean
    public HttpMessageConverters customConverters() {
        HttpMessageConverter<Object> converter = new TextJavascriptMessageConverter(new ObjectMapper());
        return new HttpMessageConverters(Collections.singletonList(converter));
    }
}

Still, I get a message that states Could not extract response: no suitable HttpMessageConverter found for response type [class example.MyResponsee] and content type [text/javascript]

I even tried to extend the MappingJackson2HttpMessageConverter, but that didn't work either. What am I missing? Also, is it a good practice to create a new converter for this, or modyfing an existing one (like I shown in the first example) is acceptable?

about 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

The documentation is a bit hazy but you should be able to just register your HttpMessageConverter bean and it will get added appropriately.

Source:

Any HttpMessageConverter bean that is present in the context will be added to the list of converters

Since you've already registered TextJavascriptMessageConverter as a bean (via @Component) you should be able to just autowire HttpMessageConverters for access to all the converters.

Though preferably you could autowire a RestTemplateBuilder which handles setting up restTemplate for you (including converters).

Example:

@SpringBootApplication
public class DemoApplication {

  @Component
  public static class TextJavascriptConverter extends AbstractJackson2HttpMessageConverter {
    public TextJavascriptConverter() {
      //can use overloaded constructor to set supported MediaType
      super(new ObjectMapper(), new MediaType("text", "javascript"));
    }
  }

  @Bean
  public ApplicationRunner demoRunner(RestTemplateBuilder builder, TextJavascriptConverter javascriptConverter) {
    return args -> {
      //can autowire RestTemplateBuilder for sensible defaults (including converters)
      RestTemplate restTemplate = builder.build();

      //confirm your converter is there
      if (restTemplate.getMessageConverters().contains(javascriptConverter)) {
        System.out.println("My custom HttpMessageConverter was registered!");
      }
    };
  }

  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }
}

Also, is it a good practice to create a new converter for this, or modyfing an existing one (like I shown in the first example) is acceptable?

You're probably better off creating your own converter otherwise you risk dropping support for the original media type(s).

about 4 years ago · Santiago Trujillo Denunciar

0

I think you should use other constructor to explicitly designate the media type.

protected AbstractJackson2HttpMessageConverter(ObjectMapper objectMapper) {
    init(objectMapper);
}

protected AbstractJackson2HttpMessageConverter(ObjectMapper objectMapper, MediaType supportedMediaType) {
    super(supportedMediaType);
    init(objectMapper);
}

protected AbstractJackson2HttpMessageConverter(ObjectMapper objectMapper, MediaType... supportedMediaTypes) {
    super(supportedMediaTypes);
    init(objectMapper);
}
about 4 years ago · Santiago Trujillo Denunciar

0

You should be able to define a new MappingJackson2HttpMessageConverter bean, that will be picked up by Boot and loaded over the default.

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(){
     MappingJackson2HttpMessageConverter jacksonConverter = new 
           MappingJackson2HttpMessageConverter();
     jacksonConverter.setSupportedMediaTypes
          (Collections.singletonList(mediaType)); 
     return jacksonConverter;
}
about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda