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版本