escape-room

[Spring] Required request parameter '인자' for method parameter type String is not present 에러

기매_ 2023. 5. 19. 01:37

 

방탈출 카페 검색을 위해 동적 쿼리를 사용하는 api를 테스트 하는 도중

2023-05-19 01:23:48.763  WARN 30972 --- [nio-8080-exec-4] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'loc' for method parameter type List is not present]
2023-05-19 01:24:23.279  WARN 30972 --- [nio-8080-exec-5] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'keyword' for method parameter type String is not present]

WARN 30972 --- [nio-8080-exec-5] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'keyword' for method parameter type String is not present]

 

에러가 발생하였다 .. !

 

내가 만들고자 하는 api는 다음과 같다.

https://{{host}}/cafe/search?loc=홍대&keyword=비밀

 : 지역이 홍대이면서 방탈출 카페 이름에 비밀이 포함되는 카페 list 반환 
https://{{host}}/cafe/search?loc=홍대&loc=건대&keyword=비밀  

 : 지역이 홍대 또는 건대이면서 카페 이름에 비밀이 포함되는 list 반환
https://{{host}}/cafe/search

 : 검색 조건이 없으므로 전체 list 반환

 

이때 마지막 https://{{host}}/cafe/search 같은 경우 loc와 keyword로 받은 파라미터가 없으므로

해당 오류가 발생하였다.


해결 방법

기존 코드

@GetMapping("/cafe/search")
public Result cafeSearchList(@RequestParam List<String> loc, @RequestParam String keyword,
                                    @PageableDefault(size = 12, sort = "name") Pageable pageable) {
    Page<CafeDTO> cafeSearchList = cafeService.cafeSearchList(loc, keyword, pageable);
    return new Result(cafeSearchList);
}

 

@RequestParam 의 required 속성의 default 값은 true 인데 이를 false로 바꾸면 된다 !

(예시 : @RequestParam(required = false) List<String> loc )

false값으로 사용하게 되면 해당 Parameter를 반드시 받지 않아도 된다.

@GetMapping("/cafe/search")
public Result cafeSearchList(@RequestParam(required = false) List<String> loc,
                             @RequestParam(required = false) String keyword,
                             @PageableDefault(size = 12, sort = "name") Pageable pageable) {
    Page<CafeDTO> cafeSearchList = cafeService.cafeSearchList(loc, keyword, pageable);
    return new Result(cafeSearchList);
}