Java 添加自定义HttpMessageConverter<;T>;
我正在尝试将自定义的Java 添加自定义HttpMessageConverter<;T>;,java,spring,rest,jackson,spring-rest,Java,Spring,Rest,Jackson,Spring Rest,我正在尝试将自定义的HttpMessageConverter添加到我的(弹簧驱动的)RESTAPI中 @Configuration public class SpringWebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new BodyPrinte
HttpMessageConverter
添加到我的(弹簧驱动的)RESTAPI中
@Configuration
public class SpringWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new BodyPrinterInterceptor());
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
final List<HttpMessageConverter> injectedConverters = new ArrayList<>();
final SimpleModule module = new SimpleModule("module", new Version(1, 0, 0, null, null, null))
.addSerializer(LocalDate.class, new LocalDateSerializer())
.addDeserializer(LocalDate.class, new LocalDateDeserializer())
.addSerializer(Type2_Numbers.class, new Type2_Numbers_Serializer())
.addDeserializer(Type2_Numbers.class, new Type2_Numbers_Deserializer());
final ObjectMapper objectMapper = new ObjectMapper()
.enable(SerializationFeature.INDENT_OUTPUT)
.registerModule(module);
final MappingJackson2HttpMessageConverter converter1 = new MappingJackson2HttpMessageConverter();
converter1.setObjectMapper(objectMapper);
injectedConverters.add(converter1);
final XmlMapper xmlMapper = new XmlMapper();
xmlMapper.registerModule(module);
xmlMapper.enable(SerializationFeature.INDENT_OUTPUT);
final Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.xml();
final MappingJackson2XmlHttpMessageConverter converter2 = new MappingJackson2XmlHttpMessageConverter(builder.build());
converter2.setObjectMapper(xmlMapper);
injectedConverters.add(converter2);
for (HttpMessageConverter injectedConverter : injectedConverters) {
converters.add(injectedConverter);
}
}
}
@配置
公共类SpringWebConfig实现WebMVCConfiguer{
@凌驾
公共无效附加接收器(侦听器注册表){
addInterceptor(新的BodyPrinterInterceptor());
}
@凌驾
public void configureMessageConverters(列出原因)
在我的案例中,导致问题的问题是,添加类型为已存在于提供的HttpMessageConverter列表中的自定义HttpMessageConverter不会导致添加新的HttpMessageConverter,也不会更新相同类型的现有HttpMessageConverter
解决方案
如果现有HttpMessageConverter对象与要添加的新自定义HttpMessageConverter对象的类型相同,则首先从列表中删除该对象,然后添加新的自定义HttpMessageConverter,从而解决了此问题
实施解决方案
Utils.java
public class Utils {
public static void injectConverter(HttpMessageConverter converterToInject, List<HttpMessageConverter<?>> convertersList) {
convertersList.removeIf(new Predicate<HttpMessageConverter<?>>() {
@Override
public boolean test(HttpMessageConverter<?> httpMessageConverter) {
return converterToInject.getClass() == httpMessageConverter.getClass();
}
});
convertersList.add(converterToInject);
}
}
@Configuration
public class SpringWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new BodyPrinterInterceptor());
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
final List<HttpMessageConverter> injectedConverters = new ArrayList<>();
final SimpleModule module = new SimpleModule("module", new Version(1, 0, 0, null, null, null))
.addSerializer(LocalDate.class, new LocalDateSerializer())
.addDeserializer(LocalDate.class, new LocalDateDeserializer())
.addSerializer(Type2_Numbers.class, new Type2_Numbers_Serializer())
.addDeserializer(Type2_Numbers.class, new Type2_Numbers_Deserializer());
final ObjectMapper objectMapper = new ObjectMapper()
.enable(SerializationFeature.INDENT_OUTPUT)
.registerModule(module);
final MappingJackson2HttpMessageConverter converter1 = new MappingJackson2HttpMessageConverter();
converter1.setObjectMapper(objectMapper);
injectedConverters.add(converter1);
final XmlMapper xmlMapper = new XmlMapper();
xmlMapper.registerModule(module);
xmlMapper.enable(SerializationFeature.INDENT_OUTPUT);
final Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.xml();
final MappingJackson2XmlHttpMessageConverter converter2 = new MappingJackson2XmlHttpMessageConverter(builder.build());
converter2.setObjectMapper(xmlMapper);
injectedConverters.add(converter2);
for (HttpMessageConverter injectedConverter : injectedConverters) {
Utils.injectConverter(injectedConverter, converters);
}
}
}
我相信您忘记在函数结束时调用super.configureMessageConverters(converters)
。建议使用以下命令
@Bean
public HttpMessageConverters additionalConverters() {
return new HttpMessageConverters(new YourCustomHttpMsgConverter());
}
然后使用GenericHttpMessageConverter扩展CustomHttpMsgConverter类
进一步编写覆盖方法的实现canRead、read、canWrite、write、canRead、canWrite、getSupportedMediaTypes我觉得有必要问一个问题。因为这个问题花费了我很多时间和精力!这里没有问题添加明确的问题。等等,我为什么要添加它?我的代码没有ad在你的代码的原始版本中,而不是你的Utils版本