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

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 : 클라이언트가 보낸 요청이 구문 상 잘못되었습니다.

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



답변

알겠습니다. 해결했습니다. 하루 종일 논스톱 코딩을 마치고 지쳐서 그런 어리석은 일을 놓칠 수있는 사람을 위해 작성하세요.

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

네, 간단합니다. DateTimeFormat 주석을 추가하기 만하면됩니다.


답변

이것은 프론트 엔드에서 형식화 된 날짜를 얻기 위해 한 일입니다.

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

원하는 것을 얻기 위해 사용할 수 있습니다.


답변

… 또는 올바른 방법으로 수행하고 애플리케이션 전체에서 날짜 직렬화 / 역 직렬화에 대한 일관된 규칙을 가질 수 있습니다. 이것을 application.properties에 넣으십시오.

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


답변

아래 솔루션은 봄 부팅 응용 프로그램에서 완벽하게 작동합니다.

제어 장치:

@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);

건배!!


답변

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"
}


답변