Spring

[Spring] SpringBoot 프로젝트 WAS 배포 후 @PathVariable을 사용하는 Controller에서 MethodArgumentTypeMismatchException이 발생할 때 해결하는 방법

Doshisha 2022. 11. 5. 18:17

개요

이번 글에서는 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