Як прийняти параметри дати у запиті GET до Spring MVC Controller?


122

У мене є GET-запит, який надсилає дату у форматі "РРРР-MM-DD" на Весняний контролер. Код контролера такий:

@RequestMapping(value="/fetch" , method=RequestMethod.GET)
    public @ResponseBody String fetchResult(@RequestParam("from") Date fromDate) {
        //Content goes here
    }

Запит надсилається правильно, коли я перевіряю Firebug. Я отримую помилку:

HTTP Status 400: Запит, надісланий клієнтом, був синтаксично неправильним.

Як я можу змусити контролер прийняти цей формат Date? Будь ласка, допоможіть. Що я роблю неправильно?

Відповіді:


250

Гаразд, я це вирішив. Написати його для тих, хто може втомитися після повного дня безперервного кодування і пропустити таку дурну річ.

@RequestMapping(value="/fetch" , method=RequestMethod.GET)
    public @ResponseBody String fetchResult(@RequestParam("from") @DateTimeFormat(pattern="yyyy-MM-dd") Date fromDate) {
        //Content goes here
    }

Так, це просто. Просто додайте примітку DateTimeFormat.


18
Я збирався написати відповідь, але ти побив мене. Ви також можете використовувати @DateTimeFormat (iso = ISO.DATE), що має той самий формат. До речі, якщо ви можете запропонувати використовувати бібліотеку Joda DateTime. Весна це дуже добре підтримує.
Лучано

Відповідь, як правило, нормально, АЛЕ! Чи є спосіб налаштувати його за замовчуванням для Spring? Трохи надмірно вкладати @DateTimeFormatкожен контролер, який у вас є ...
thorinkor

3
@Luciano звичайно, ви можете зробити @DateTimeFormat (iso = ISO.DATE_TIME) також
kiedysktos

2
@thorinkor У весняному завантаженні ви можете встановити spring.mvc.date-formatатрибут у application.propertiesабо додати боби, які реалізують org.springframework.formatінтерфейс (розширення org.springframework.format.datetime.DateFormatter- це, мабуть, шлях). У незагрузочном Spring ви можете метод і додавати Formatter реалізують бобів там. @OverrideaddFormattersWebMvcConfigurerAdapter
UTF_or_Death

10

Це те, що я зробив для форматування дати з переднього кінця

  @RequestMapping(value = "/{dateString}", method = RequestMethod.GET)
  @ResponseBody
  public HttpStatus getSomething(@PathVariable @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) String dateString) {
   return OK;
  }

Ви можете використовувати його, щоб отримати те, що ви хочете.


11
Не зрозумів. Який сенс додавати @ DateTimeFormat до @ PathVariable, якщо ви отримуєте dateString як String, а не як Date?
Іклон Циклон

7

... або ви можете зробити це правильно і мати цілісне правило щодо серіалізації / десериалізації дат у всій програмі. помістіть це у application.properties:

spring.mvc.date-format=yyyy-MM-dd

3

Нижче рішення чудово працює для застосування весняного завантаження.

Контролер:

@GetMapping("user/getAllInactiveUsers")
List<User> getAllInactiveUsers(@RequestParam("date") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") Date dateTime) {
    return userRepository.getAllInactiveUsers(dateTime);
}

Отже, в абонента (в моєму випадку це веб-потік) нам потрібно передати час дати в такому ( "yyyy-MM-dd HH: mm: ss" ) форматі.

Сторона виклику:

public Flux<UserDto> getAllInactiveUsers(String dateTime) {
    Flux<UserDto> userDto = RegistryDBService.getDbWebClient(dbServiceUrl).get()
            .uri("/user/getAllInactiveUsers?date={dateTime}", dateTime).retrieve()
            .bodyToFlux(User.class).map(UserDto::of);
    return userDto;
}

Репозиторій:

@Query("SELECT u from User u  where u.validLoginDate < ?1 AND u.invalidLoginDate < ?1 and u.status!='LOCKED'")
List<User> getAllInactiveUsers(Date dateTime);

Ура !!


2

Якщо ви хочете використовувати PathVariable, ви можете використовувати приклад нижче, наведений нижче (всі методи є і роблять те саме):

//You can consume the path .../users/added-since1/2019-04-25
@GetMapping("/users/added-since1/{since}")
public String userAddedSince1(@PathVariable("since") @DateTimeFormat(pattern = "yyyy-MM-dd") Date since) {
    return "Date: " + since.toString(); //The output is "Date: Thu Apr 25 00:00:00 COT 2019"
}

//You can consume the path .../users/added-since2/2019-04-25
@RequestMapping("/users/added-since2/{since}")
public String userAddedSince2(@PathVariable("since") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date since) {
    return "Date: " + since.toString(); //The output is "Date: Wed Apr 24 19:00:00 COT 2019"
}

//You can consume the path .../users/added-since3/2019-04-25
@RequestMapping("/users/added-since3/{since}")
public String userAddedSince3(@PathVariable("since") @DateTimeFormat(pattern = "yyyy-MM-dd") Date since) {
    return "Date: " + since.toString(); //The output is "Date: Thu Apr 25 00:00:00 COT 2019"
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.