Как принять параметры Date в GET-запросе к Spring MVC Controller?
У меня есть запрос GET, который отправляет дату в формате YYYY-MM-DD в Spring Controller. Код контроллера выглядит следующим образом:
@RequestMapping(value="/fetch" , method=RequestMethod.GET)
public @ResponseBody String fetchResult(@RequestParam("from") Date fromDate) {
//Content goes here
}
Запрос отправлен правильно, так как я проверяю с Firebug. Я получаю ошибку:
HTTP Status 400: запрос, отправленный клиентом, был синтаксически неверным.
Как я могу заставить контроллер принять этот формат даты? Пожалуйста помоги. Что я делаю неправильно?
7 ответов
Хорошо, я решил это. Писать это для тех, кто может устать после целого дня непрерывного кодирования и пропустить такую глупую вещь.
@RequestMapping(value="/fetch" , method=RequestMethod.GET)
public @ResponseBody String fetchResult(@RequestParam("from") @DateTimeFormat(pattern="yyyy-MM-dd") Date fromDate) {
//Content goes here
}
Да все просто Просто добавьте аннотацию DateTimeFormat.
... или вы можете сделать это правильно и иметь последовательное правило для сериализации / десериализации дат во всем приложении. поместите это в application.properties:
spring.mvc.date-format=yyyy-MM-dd
Это то, что я сделал, чтобы получить отформатированную дату из внешнего интерфейса
@RequestMapping(value = "/{dateString}", method = RequestMethod.GET)
@ResponseBody
public HttpStatus getSomething(@PathVariable @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) String dateString) {
return OK;
}
Вы можете использовать его, чтобы получить то, что вы хотите.
Нижеприведенное решение отлично работает для приложения с весенней загрузкой.
Контроллер:
@GetMapping("user/getAllInactiveUsers")
List<User> getAllInactiveUsers(@RequestParam("date") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") Date dateTime) {
return userRepository.getAllInactiveUsers(dateTime);
}
Таким образом, в вызывающей программе (в моем случае это веб-поток) нам нужно передать дату и время в этом формате ("гггг-ММ-дд ЧЧ: мм: сс").
Сторона звонящего:
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);
Ура!!
Если вы хотите использовать 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"
}
Ты можешь использовать :
public @ResponseBody String fetchResult(@RequestParam("from")@DateTimeFormat(pattern="yyyy-MM-dd") Date fromDate) {// Ваш код ...
}
2000-10-31T01:30:00.000-05:00 конвертировать в Datetime (Joda)
@GetMapping("test/{dateTimeStart}")
public void getCheckDaily2(
@PathVariable(value = "dateTimeStart", required = false)
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
DateTime dateTimeStart){
body here...
}