在 Spring Boot 中注册自定义 MessageConverter

2023-12-03

我想使用返回的 RESTful 服务text/javascript内容类型。

由于没有 OOTBHttpMessageConverter可以在 Spring Boot 中执行此操作,我想注册一个自定义转换器。

我发现做到这一点的一种方法是自定义RestTemplate本身通过修改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);
    }
}

然后,在我的服务中,只需致电getCustomRestTemplate(new MediaType("text", "javascript")

上面的解决方案工作正常,但我也尝试创建一个新的转换器来处理这种媒体类型,根据Spring Boot 文档 (27.1.2):

所以我创建了一个新的转换器:

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

然后尝试像文档中那样注册它:

@Configuration
public class ApplicationConfiguration {

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

尽管如此,我还是收到一条消息说Could not extract response: no suitable HttpMessageConverter found for response type [class example.MyResponsee] and content type [text/javascript]

我什至尝试延长MappingJackson2HttpMessageConverter,但这也不起作用。我缺少什么?另外,为此创建一个新的转换器是一个很好的做法,还是可以接受修改现有的转换器(就像我在第一个示例中所示的那样)?


该文档有点模糊,但您应该能够只注册您的 HttpMessageConverter bean,它就会被适当地添加。

Source:

上下文中存在的任何 HttpMessageConverter bean 都将添加到转换器列表中

既然你已经注册了TextJavascriptMessageConverter作为一个bean(通过@Component)你应该能够自动装配HttpMessageConverters用于访问所有转换器。

虽然最好你可以自动装配RestTemplateBuilder它为您处理设置restTemplate(包括转换器)。

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

另外,为此创建一个新的转换器是一个好的做法,还是可以接受修改现有的转换器(就像我在第一个示例中所示的那样)?

您最好创建自己的转换器,否则您可能会失去对原始媒体类型的支持。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Spring Boot 中注册自定义 MessageConverter 的相关文章

随机推荐