Spring MappingJackson2HttpMessageConverter не запускается? - PullRequest
0 голосов
/ 21 мая 2018

У меня довольно старое приложение Java 8 / Spring, которое предоставляет REST API.Ответ отправляется в формате JSON или XML в зависимости от заголовка Accept.

Так, например,

  • application / json-v1 преобразует ответ в JSON версии 1 объекта ответа
  • application / json-v2 - преобразует ответ в JSON версии 1 объекта ответа
  • application / xml-v1 - преобразует ответ в XML версии 1 объекта ответа

Приложение сейчас в Spring 5, но изначально было в Spring3, и этот аспект никогда не конвертировался в конфигурацию кода.

Таким образом, XML-файл конфигурации ядра имеет такой

<!-- Enables the Spring MVC @Controller programming model, and set converters in use -->
    <mvc:annotation-driven>
        <message-converters>
            <beans:bean class="com.packagpath.AppJaxb2RootElementHttpMessageConverter">
                <beans:property name="supportedMediaTypes">
                    <beans:list>
                        <beans:bean class="org.springframework.http.MediaType">
                            <beans:constructor-arg index="0" value="application"/>
                            <beans:constructor-arg index="1" value="xml"/>
                        </beans:bean>
                        <beans:bean class="org.springframework.http.MediaType">
                            <beans:constructor-arg index="0" value="application"/>
                            <beans:constructor-arg index="1" value="xml-v1"/>
                        </beans:bean>
                        <beans:bean class="org.springframework.http.MediaType">
                            <beans:constructor-arg index="0" value="application"/>
                            <beans:constructor-arg index="1" value="xml-v2"/>
                        </beans:bean>
                    </beans:list>
                </beans:property>
            </beans:bean>

            <beans:bean class="com.packagpath.AppMappingJackson2HttpMessageConverter">
                <beans:property name="supportedMediaTypes">
                    <beans:list>
                        <beans:bean class="org.springframework.http.MediaType">
                            <beans:constructor-arg index="0" value="application"/>
                            <beans:constructor-arg index="1" value="json"/>
                        </beans:bean>
                        <beans:bean class="org.springframework.http.MediaType">
                            <beans:constructor-arg index="0" value="application"/>
                            <beans:constructor-arg index="1" value="json-v1"/>
                        </beans:bean>
                        <beans:bean class="org.springframework.http.MediaType">
                            <beans:constructor-arg index="0" value="application"/>
                            <beans:constructor-arg index="1" value="json-v2"/>
                        </beans:bean>
                    </beans:list>
                </beans:property>
            </beans:bean>
            <beans:bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
        </message-converters>
    </mvc:annotation-driven>

    <beans:bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    </beans:bean>

Контроллеры имеют атрибуты продукции, установленные вдоль этих строк

@RequestMapping(method = RequestMethod.GET, value = AppController.RESOURCE_NAME + "/{id}", produces = {
            XML_MIME_TYPE_DEFAULT, JSON_MIME_TYPE_DEFAULT, XML_MIME_TYPE_V1, JSON_MIME_TYPE_V1,
            XML_MIME_TYPE_V2, JSON_MIME_TYPE_V2 })
    @ResponseBody
    public Person getAccount(@PathVariable(value = "id") String id, HttpServletRequest request) { ...

Основной класс переопределения для обработчика JSON находится вдоль этих линий ...

public class AppMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {
    private Utils utils = new Utils();

    /**
     * Init method must be called to ensure the object mapper used by this converter ignores null fields.
     */
    @PostConstruct
    public void init() {
        System.out.println("init 1");
        getObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
        System.out.println("init 2");

    }
//
    @Override
    protected void writeInternal(Object responseObject,  HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
        System.out.println("VersionConversion versionConversion");
    ...

Итак, установивсцена.Версия XML работает хорошо.

    public class AppJaxb2RootElementHttpMessageConverter extends Jaxb2RootElementHttpMessageConverter {
        private Utils utils = new Utils();

        @Override
        protected void writeToResult(Object responseObject, HttpHeaders headers, Result result) throws IOException {
            VersionConversion versionConversion = AnnotationUtils.findAnnotation(responseObject.getClass(), VersionConversion.class);
...

Базовая конфигурация, кажется, работает для обработчика сообщений JSON, как будто я помещаю настроенный тип Mime в заголовок, он возвращает документ JSON, но если я помещаю несуществующую версию, он выдает ошибку.

Однако метод writeInternal никогда не вызывается, и поэтому любой код изменения версии никогда не будет достигнут.Я смотрел на это с нескольких сторон, и я не могу понять, почему.Неуклюжие операторы Init 1, init2 print получают вывод на консоль.Я уверен, что раньше это работало, но я не вижу, что сейчас отличается, и поскольку все это связано весной, я не уверен, как исследовать дальше, чем искать код на наличие ошибок!

Если кто-нибудь знает, в чем может быть проблема, это было бы фантастически, в настоящий момент, хотя я не уверен, как и где исследовать, как: а) определенно используемый код и б) я не вижучто-то не так в конфиге, которое изменилось.Мне интересно, если это изменение в зависимостях, которые я не заметил в то время?

...