在Spring Boot中注册自定义MessageConverter
我想使用返回text/javascript
内容类型的RESTful服务。
由于HttpMessageConverter
在Spring Boot中没有OOTB 可以做到这一点,因此我想注册一个自定义转换器。
我发现这样做的一种方法是RestTemplate
通过修改自定义自身MappingJackson2HttpMessageConverter
:
@Componentpublic 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),上述解决方案可以正常工作,但是我也尝试创建一个新的Converter来处理该一种媒体类型:
所以我创建了一个新的Converter:
@Componentpublic 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);
}
}
然后尝试像在文档中一样进行注册:
@Configurationpublic 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,它就会被适当地添加。
资源:
上下文中存在的任何HttpMessageConverter bean都将添加到转换器列表中
由于您已经注册TextJavascriptMessageConverter
为bean(通过@Component),因此您应该能够自动装配HttpMessageConverters
以访问所有转换器。
虽然最好您可以自动为a RestTemplateBuilder
接线,以为您设置restTemplate(包括转换器)。
例:
@SpringBootApplicationpublic 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);
}
}
另外,为此目的创建一个新的转换器还是修改现有转换器(如我在第一个示例中显示的那样)是一个好习惯吗?
您最好创建自己的转换器,否则就有可能放弃对原始媒体类型的支持。
以上是 在Spring Boot中注册自定义MessageConverter 的全部内容, 来源链接: utcz.com/qa/425679.html