Spring MVC 컨트롤러에 대한 GET 요청에서 날짜 매개 변수를 수락하는 방법은 무엇입니까?


122

YYYY-MM-DD 형식의 날짜를 Spring 컨트롤러에 보내는 GET 요청이 있습니다. 컨트롤러 코드는 다음과 같습니다.

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

Firebug로 확인하면서 요청이 올바르게 전송됩니다. 오류가 발생합니다.

HTTP 상태 400 : 클라이언트가 보낸 요청이 구문 상 잘못되었습니다.

컨트롤러가이 날짜 형식을 받아들이도록하려면 어떻게해야합니까? 도와주세요. 내가 뭘 잘못하고 있죠?

답변:


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)을 사용할 수도 있습니다. BTW, 가능한 경우 Joda DateTime 라이브러리를 사용하는 것이 좋습니다. Spring은 그것을 정말 잘 지원합니다.
Luciano 2013 년

대답은 일반적으로 괜찮지 만! Spring의 기본값으로 구성하는 방법이 있습니까? 그것은 과잉 조금 넣어 것 @DateTimeFormat... 당신이 가진 모든 컨트롤러
thorinkor

3
@Luciano 물론 @DateTimeFormat (iso = ISO.DATE_TIME)도 할 수 있습니다.
kiedysktos

2
@thorinkor Spring Boot에서 spring.mvc.date-format속성을 설정 application.properties하거나 org.springframework.format인터페이스 를 구현하는 빈을 추가 할 수 있습니다 (확장하는 org.springframework.format.datetime.DateFormatter것이 아마도 갈 길일 것입니다). Non-Boot Spring에서는 Formatter를 구현하는 Bean @OverrideaddFormatters메서드를 WebMvcConfigurerAdapter추가 할 수 있습니다 .
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
이해하지 못했습니다. dateString을 Date가 아닌 String으로 수신하면 @ DateTimeFormat을 @ PathVariable에 추가하는 이유는 무엇입니까?
ILya Cyclone 2017

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"
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.