RK1*_*RK1 4 java spring spring-boot
我想使用返回内容类型的 RESTful 服务text/javascript。
由于 Spring Boot 中没有HttpMessageConverter可以执行此操作的 OOTB,因此我想注册一个自定义转换器。
我发现做到这一点的一种方法是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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,在我的服务中,只需致电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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后尝试像文档中那样注册它:
@Configuration
public class ApplicationConfiguration {
@Bean
public HttpMessageConverters customConverters() {
HttpMessageConverter<Object> converter = new TextJavascriptMessageConverter(new ObjectMapper());
return new HttpMessageConverters(Collections.singletonList(converter));
}
}
Run Code Online (Sandbox Code Playgroud)
尽管如此,我还是收到一条消息说Could not extract response: no suitable HttpMessageConverter found for response type [class example.MyResponsee] and content type [text/javascript]
我什至尝试延长MappingJackson2HttpMessageConverter,但这也不起作用。我缺少什么?另外,为此创建一个新的转换器是一个很好的做法,还是可以接受修改现有的转换器(就像我在第一个示例中所示的那样)?
小智 6
该文档有点模糊,但您应该能够只注册您的 HttpMessageConverter bean,它就会被适当地添加。
上下文中存在的任何 HttpMessageConverter bean 都将添加到转换器列表中
由于您已经注册TextJavascriptMessageConverter为 bean(通过 @Component),您应该能够自动装配HttpMessageConverters以访问所有转换器。
不过最好你可以自动装配一个RestTemplateBuilder来为你设置restTemplate(包括转换器)。
例子:
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
另外,为此创建一个新的转换器是一个很好的做法,还是可以接受修改现有的转换器(就像我在第一个示例中所示的那样)?
您最好创建自己的转换器,否则您可能会失去对原始媒体类型的支持。
| 归档时间: |
|
| 查看次数: |
16074 次 |
| 最近记录: |