gpt4 book ai didi

java - 在 Spring Boot 中注册自定义 MessageConverter

转载 作者:行者123 更新时间:2023-12-01 21:59:09 25 4
gpt4 key购买 nike

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

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

我发现实现此目的的一种方法是通过修改 MappingJackson2HttpMessageConverter 来自定义 RestTemplate 本身:

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

不过,我收到一条消息,指出无法提取响应:没有找到适合响应类型 [class example.MyResponsee] 和内容类型 [text/javascript] 的合适的 HttpMessageConverter

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

最佳答案

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

Source:

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

由于您已经将 TextJavascriptMessageConverter 注册为 bean(通过 @Component),您应该能够 Autowiring HttpMessageConverters 来访问所有转换器。

不过,您最好可以 Autowiring 一个 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);
}
}

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?

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

关于java - 在 Spring Boot 中注册自定义 MessageConverter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43029021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com