Почему Spring Boot изменяет формат ответа JSON, даже если настроен специальный конвертер, который никогда не обрабатывает JSON? - PullRequest
1 голос
/ 29 февраля 2020

Я столкнулся с проблемой при попытке ответить на вопрос:
Запрос с multipart / form-data возвращает ошибку 415

Согласно документу о HttpMessageConverters ( Spring Boot Features 7.1.2. HttpMessageConverters ), мы можем добавить пользовательский HttpMessageConverter, настроив bean-компонент HttpMessageConverters. Я вижу ответ JSON, которого я не ожидал, когда настраивал собственный конвертер.


Я создал простую конечную точку, которая возвращает JSON, состоящее из полей Date и LocalDate.

  • Когда я не настраиваю какой-либо пользовательский конвертер Я получаю их в формате String.
{
   "date": "2020-02-29T06:13:45.875+0000",
   "localDate": "2020-02-29"
}
  • Когда я настраиваю пользовательский конвертер, который НЕ обрабатывает JSON ответов, я получаю их в формате Number.
{
    "date": 1582956902270,
    "localDate": [
        2020,
        2,
        29
    ]
}

Мои вопросы:

  • Почему формат ответа JSON изменяется, даже когда я настраиваю пользовательский конвертер, никогда не обрабатывающий ответы JSON?
  • Как этого избежать? Я хочу, чтобы Spring Boot обрабатывал JSON ответов так же, как это происходит, когда я не настраивал пользовательские конвертеры.

[Пример приложения]

Spring Boot Версия: 2.2.5. RELEASE

@RestController
@SpringBootApplication
public class MyApplication {

    @GetMapping("/test")
    public SomeDates test() {
        return new SomeDates(new Date(), LocalDate.now());
    }

    @Data
    public class SomeDates {
        private final Date date;
        private final LocalDate localDate;
    }

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
@Configuration
public class MyConfigurer {

    @Bean
    public HttpMessageConverters customConverters() {
        return new HttpMessageConverters(new ConverterDoingNothingForTestPurpose());
    }

    public static class ConverterDoingNothingForTestPurpose implements HttpMessageConverter<Object> {

        @Override
        public boolean canRead(Class<?> clazz, MediaType mediaType) {
            return false;
        }

        @Override
        public boolean canWrite(Class<?> clazz, MediaType mediaType) {
            return false;
        }

        @Override
        public List<MediaType> getSupportedMediaTypes() {
            return Collections.emptyList();
        }

        @Override
        public Object read(Class<?> clazz, HttpInputMessage inputMessage)
                throws IOException, HttpMessageNotReadableException {
            throw new RuntimeException("This converter should not be invoked.");
        }

        @Override
        public void write(Object t, MediaType contentType, HttpOutputMessage outputMessage)
                throws IOException, HttpMessageNotWritableException {
            throw new RuntimeException("This converter should not be invoked.");
        }
    }
}

1 Ответ

2 голосов
/ 29 февраля 2020

Объявив свой собственный компонент HttpMessageConverters, вы остановили настройку Spring MVC с помощью преобразователей Spring Boot. Важно, что в этом случае Spring MVC использует конвертер по умолчанию JSON, а не Spring Boot. Вот почему ответ JSON изменился.

Если вы хотите добавить пользовательский конвертер к тем, которые Spring Boot сконфигурировал по умолчанию, удалите ваш компонент HttpMessageConverters и определите вместо него компонент для вашего собственного конвертера:

@Bean
ConverterDoingNothingForTestPurpose testConverter() {
    return new ConverterDoingNothingForTestPurpose();
}

Ваш пользовательский конвертер будет выбран автоматически сконфигурированным компонентом HttpMessageConverters в качестве дополнительного конвертера.

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