Добавление пользовательского HttpMessageConverter <T> - PullRequest
0 голосов
/ 20 мая 2018

Я пытаюсь добавить пользовательский HttpMessageConverter<T> в мой (Spring-powered) REST API.

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

Похоже, что добавленные конвертеры не работают.(Сериализаторы и десериализаторы не вызываются)

Вопрос Как правильно добавить HttpMessageConverters?

Ответы [ 3 ]

0 голосов
/ 20 мая 2018

Полагаю, вы забыли позвонить super.configureMessageConverters(converters) в конце своей функции.

0 голосов
/ 20 мая 2018

Предложите использовать следующее

@Bean
public HttpMessageConverters additionalConverters() {
    return new HttpMessageConverters(new YourCustomHttpMsgConverter());
}

Затем расширьте класс YourCustomHttpMsgConverter с помощью GenericHttpMessageConverter

Далее напишите свою реализацию для методов переопределения canRead, read, canWrite, write, canRead, canWrite, getSupportedMediaTypes

0 голосов
/ 20 мая 2018

Причина

Проблема, которая вызвала проблему в моем случае, заключалась в том, что добавление настраиваемого HttpMessageConverter типа, который уже существует в предоставленном списке HttpMessageConverters, не приведет к добавлению нового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);
    }
}

SpringWebConfig.java

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

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...