Как вернуть LocalDateTime из конечной точки контроллера REST? - PullRequest
0 голосов
/ 19 февраля 2020

Я пишу REST-контроллер в Spring- java, и одна из моих конечных точек должна возвращать переменную LocalDateTime.

@GetMapping(path = "/lastDateTimeOfReset")
LocalDateTime fetchLastDateTimeOfReset() {
   return mongoManagerService.fetchLastDateTimeOfReset();
}

Это запрос клиента :

ResponseEntity<LocalDateTime> lastDateEntity = restTemplate.getForEntity(url, LocalDateTime.class);

Я получаю следующее исключение на моей стороне клиента:

org.springframework.web.client.RestClientException: 
Error while extracting response for type [class java.time.LocalDateTime] and content type [application/json;charset=UTF-8]; 
nested exception is org.springframework.http.converter.HttpMessageNotReadableException: 
JSON parse error: Expected array or string.; 
nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Expected array or string.
at [Source: (PushbackInputStream); line: 1, column: 1]

Я проверил возвращаемое значение в режиме отладки, и это допустимый LocalDateTime. Почему выдается это исключение и как его преодолеть?

Ответы [ 3 ]

0 голосов
/ 19 февраля 2020

Вам необходимо проверить тип возвращаемого значения из mongoManagerService.fetchLastDateTimeOfReset ();

или протестировать приложение с помощью приведенного ниже примера кода

Сервис

@GetMapping(path = "/lastDateTimeOfReset")
    LocalDateTime fetchLastDateTimeOfReset() {
       return LocalDateTime.now();
    }

Клиент

RestTemplate rs = new RestTemplate();
ResponseEntity<LocalDateTime> lastDateEntity = rs.getForEntity(new URI("http://localhost:8089/lastDateTimeOfReset"), LocalDateTime.class);
System.out.println(lastDateEntity);

Выход

<200,2020 -02-19T15: 00: 51.603220, [Content-Type: "application / json; charset = UTF-8", кодирование передачи: "chunked", дата: "ср., 19 февраля 2020 г. 09:30:51 GMT"] >

0 голосов
/ 19 февраля 2020

Проблема решена! В общем, я должен был добавить эту конфигурацию в мое приложение:

@Configuration
public class MvcConfig {    
    @Configuration
    @EnableWebMvc
    public class MessageConvertersConfiguration implements WebMvcConfigurer {
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            converters.add(new MappingJackson2HttpMessageConverter(objectMapper()));
        }

        @Bean
        public ObjectMapper objectMapper() {
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy'T'HH:mm:ss");
            SimpleModule localDateModule = new SimpleModule();
            localDateModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(dateTimeFormatter));
            localDateModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter));

            ObjectMapper mapper = new ObjectMapper();
            mapper.registerModules(localDateModule);

            return mapper;
        }
    }
}

* ВАЖНО !!! - В тестах добавьте это в свой шаблон отдыха: *

restTemplate.setMessageConverters(Collections.singletonList(new MappingJackson2HttpMessageConverter(objectMapper())));
0 голосов
/ 19 февраля 2020

Вы можете использовать String для преодоления этой проблемы.

@GetMapping(path = "/lastDateTimeOfReset")
String fetchLastDateTimeOfReset() {
   return (mongoManagerService.fetchLastDateTimeOfReset()).toString();
}

Запрос клиента:

ResponseEntity<String> lastDateEntity = restTemplate.getForEntity(url, String.class);
...