개요
이번 글에서는 SpringBoot 프로젝트를 WAS 배포 후 @PathVariable을 사용하는 Controller에서 MethodArgumentTypeMismatchException이 발생하는 문제를 해결하는 방법에 대하여 이야기해보려고 한다.
문제상황
Controller
@RequestMapping(value = "/memberList/orderType={orderType}&pageNum={pageNum}")
public String list(@PathVariable("orderType") int orderType, @PathVariable("pageNum") int pageNum, Model model) {
HashMap<String,Integer> pageNationParam = pageNationUtil.setPageNation(userService.selectMemberListTotalCount(), pageNum);
model.addAttribute("curPageNum", pageNum);
model.addAttribute("totalPageNum", pageNationParam.get("totalPageNum"));
model.addAttribute("memberLists", userService.selectMemberList(orderType, pageNationParam.get("limit"), pageNationParam.get("offset")));
return "/user/list";
}
Tomcat Log
2022-11-05 17:55:31.974 WARN 40436 --- [nio-8080-exec-5] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'int'; nested exception is java.lang.NumberFormatException: For input string: "0&pageNum=1"]
위와 같이 Controller를 작성하고 배포 후에 http://localhost:8080/memberList/orderType=0&pageNum=1
경로로 접속해보니 저런 오류 로그가 찍혀있었다.
로그를 읽어보면 PathVariable에 들어온 값이 "0&pageNum=1"이라 int형이 아닌 String형으로 받아져서 타입이 안맞는 Exception이 발생한 것인데
로컬에서는 전혀 문제가 없었고 PathVariable 또한 orderType과 pageNum을 각각 받아올 수 있도록 작성해놔서 문제를 해결하기가 쉽지 않았다.
해결방법
이 문제는 Controller에 정답이 있었다.
@RequestMapping에서 method 옵션을 지정하지 해주지 않아서 발생한 문제인데
method를 지정하지 않는다면 default로 모든 HTTP 메소드를 지원하기 때문에 이러한 문제가 발생한 것이다.
즉 이 문제를 해결하기 위해서는 Controller에 @RequestMapping에서 method 옵션을 Allow하고 싶은 method 옵션만 지정하여 문제를 해결할 수 있다.
@RequestMapping(value = "/memberList/orderType={orderType}&pageNum={pageNum}", method = {RequestMethod.GET, RequestMethod.POST})
public String list(@PathVariable("orderType") int orderType, @PathVariable("pageNum") int pageNum, Model model) {
HashMap<String,Integer> pageNationParam = pageNationUtil.setPageNation(userService.selectMemberListTotalCount(), pageNum);
model.addAttribute("curPageNum", pageNum);
model.addAttribute("totalPageNum", pageNationParam.get("totalPageNum"));
model.addAttribute("memberLists", userService.selectMemberList(orderType, pageNationParam.get("limit"), pageNationParam.get("offset")));
return "/user/list";
}
참고
https://www.hyojae.info/193b50e8-b49b-4f0c-8d8d-3d3e24f6d0ac
'Spring' 카테고리의 다른 글
[Spring] JPA에서 findBy 매개변수 없이 사용하기 (0) | 2022.12.07 |
---|---|
[Spring] SpringBoot에서 환경에 따른 Properties 사용하기(Spring Profiles) (0) | 2022.11.12 |
[Spring] SpringBoot에서 에러 페이지 설정하기 (2) | 2022.09.26 |
[Spring] Ajax에서 Success값이 넘어오지 않을 때 확인해봐야 할 사항들 (0) | 2022.09.22 |
[Spring] pom.xml 빌드 후 발생하는 instruction can not have PITarget with reserved xml name 에러 해결하기 (0) | 2022.09.20 |