2021-05-28-TIL
2021-05-28-TIL
@RequestParam to be nullable
1
2
3
4
@GetMapping
public searchDto search(@RequestParam(name = "check-in", required = false) String checkIn) {
...
}
기본적으로 파라미터는 required = true값을 갖는다. 따라서 파라미터가 null이라도 동작하도록 하려면 required = false을 추가해주어야 한다.
- https://stackoverflow.com/questions/12296642/is-it-possible-to-have-empty-requestparam-values-use-the-defaultvalue
@RequestParam Javadoc에 따르면 required의 기본값은 true이고, 요청에 파라미터가 없으면 예외가 난다. Spring MVC에서는 MissingServletRequestParameterException이 나고, 기본 예외 처리기는 이를 400 응답으로 바꾼다(DefaultHandlerExceptionResolver). 선택적인 파라미터를 다루는 방법은 세 가지다.
required = false: 값이 없으면null이 들어온다. 그래서int같은 기본형에는 쓸 수 없고Integer처럼 참조형이어야 한다.defaultValue = "...": 값이 없거나 빈 값일 때 기본값을 쓴다. 기본값을 주면required는 암묵적으로false가 된다.Optional<String>: 파라미터 타입을Optional로 받으면 없음을 타입으로 표현할 수 있다.
1
2
3
4
5
6
@GetMapping
public SearchDto search(
@RequestParam(name = "check-in", required = false) String checkIn,
@RequestParam(defaultValue = "1") int guests) {
...
}
숙소 검색처럼 조건이 선택적인 API에서는 required = false로 받은 값이 null인지에 따라 쿼리 조건을 붙이거나 뺀다.
String to LocalDate
- https://stackoverflow.com/questions/8746084/string-to-localdate/22538939#22538939
LocalDate.parse("2021-08-01")처럼 문자열 하나만 넘기면 DateTimeFormatter.ISO_LOCAL_DATE, 즉 yyyy-MM-dd 형식으로 해석한다. 다른 형식이면 포매터를 함께 넘긴다(LocalDate Javadoc).
1
2
LocalDate checkIn = LocalDate.parse("2021-08-01");
LocalDate checkOut = LocalDate.parse("2021.08.30", DateTimeFormatter.ofPattern("yyyy.MM.dd"));
해석에 실패하면 DateTimeParseException이 나는데, 이 예외는 RuntimeException 계열이라 SimpleDateFormat의 ParseException처럼 반드시 잡을 필요는 없다. LocalDate는 불변이고 스레드 안전해서 포매터와 함께 상수로 두고 공유해도 된다.
컨트롤러에서는 직접 파싱하지 않고 @RequestParam(name = "check-in", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate checkIn처럼 받아도 된다. @DateTimeFormat은 java.time 타입을 지원하고, ISO.DATE는 yyyy-MM-dd 형식이다.
댓글
아직 댓글이 없습니다