2022. 4. 6. 20:23ㆍ에러
Parameter값이 null 인 경우가 있다.
이때 컨트롤러에서 정수형 값으로 받는다고 가정한다면 int 타입은 null을 저장할 수 없기 때문에 오류가 발생한다.
따라서 null이 들어올 수 있는 상황에서는 Wrapper 형식인 Integer로 받는다.
@GetMapping("/")
public String list(int page, String condition, String keyword, SearchVO search, HttpServletRequest request, Model model, RedirectAttributes ra) {}
위와 같은 메서드로 코드가 짜여있을때 해당 URL이 https://sungin.tistory.com/ 라고 가정하고 접속을 한다면 메서드에서 자동으로 page라는 name의 Parameter와 value값을 찾은 후 콘솔창에 아래와 같은 오류를 출력한다.
HTTP 상태 Error 500 - 내부 서버 오류
Optional int parameter 'page' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.
"선택적 int 매개변수 'page'가 있지만 기본 유형으로 선언되었기 때문에 null 값으로 변환할 수 없습니다. 해당 기본 유형에 대한 객체 래퍼로 선언하는 것을 고려하십시오."
즉, page라는 이름의 파라미터의 값을 받으려고 하는데 해당 값은 정수형 기본 타입인 int형 변수이고 null값을 받을수 없으니 Wrapper타입(Integer)으로 선언해라 라는 말이다.
컨트롤러에서 읽어들일때 요청정보 헤더의 URI 에서 page라는 Parameter를 찾는데, 위와같이 주소창에 QueryString이 없는 경우 컨트롤러는 해당 Parameter 값이 곧 null 임으로 인식한다.
또한 페이징처리와 검색처리를 함께 할 경우 이러한 오류가 발생할 수 있다.
https://sungin.tistory.com/?page=&keword=Integer 과 같은 URL이 있고 컨트롤러가 아래와 같이 선언되있다면
@GetMapping("/")
public String list(int page, String condition, String keyword, SearchVO search, HttpServletRequest request, Model model, RedirectAttributes ra) {}
다음과 같은 오류를 출력한다.
HTTP 상태 Error 400 - 잘못된 요청
Failed to convert value of type 'java.lang.String' to required type 'int'; nested exception is java.lang.NumberFormatException: For input string: ""
'java.lang.String' 유형의 값을 필수 유형 'int'로 변환하지 못했습니다. 중첩 예외는 java.lang.NumberFormatException입니다. 입력 문자열의 경우: ""
QueryString 에서 Parameter는 기본적으로 문자열 형식인 String 타입으로 받는다.
즉, 파라미터 값이 ?page= 와 같이 값이 비어있는 형태로 전달될 경우 "" (공백)값으로 인식되기 때문에 정수형 자료형의 기본 타입에 맞지않아 오류가 발생한 것 이다.
따라서 위와 같은 경우 또한 컨트롤러의 맵핑 메소드에서 정수형 자료형의 기본 타입인 int 가 아닌 랩퍼형 Integer을 선언하여 파라미터 값을 받아야 한다.
(String의 "" 공백 형태가 Integer 변수에 null 형태로 저장됨.)
public String list(Integer page, String condition, String keyword, SearchVO search, HttpServletRequest request, Model model, RedirectAttributes ra) {}