Я столкнулся с проблемой при попытке ответить на вопрос:
Запрос с 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.");
}
}
}