본문 바로가기
에러 기록

java.lang.IllegalArgumentException: Name for argument of type [java.lang.Integer] not specified, and parameter name information not available via reflection - 스프링. 파라미터 어노테이션에 자동 이름 부여가 안되는 오류

by 샤샤샤샤 2024. 1. 31.

오류 상황

    @GetMapping("/test")
    public String test(@RequestParam Integer data){
        return "ok";
    }

이 컨트롤러에 
http://localhost:8080/test?data=10

요청시

java.lang.IllegalArgumentException: Name for argument of type [java.lang.Integer] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag.

오류가 터지며 응답이 안된다.

 

원인

원래는 자동으로 변수 이름이 @RequestParam 의 name 값으로 지정되어 바인딩되어야 맞다. 하지만 이것이 이뤄지지 않는 것이 문제다.

 

구글링 결과, 자바 3.2xx 버전 이상부터는 디버그 모드가 아니라면 컴파일시 변수명 정보를 안가지고 있기에, 컨트롤러가 디버그 모드로 컴파일되던가 따로 설정을 해줘야한다.

 

 

해결

1. 컴파일러, 빌드 도구를 gradle로 사용할 경우

이 경우

build.gradle에

compileJava {	
    options.compilerArgs << '-parameters'
}

해당 코드를 추가하자.

 

2. 컴파일러, 빌드 도구를 intellij로 사용할 경우

이경우 아래와 같이 설정해주자.

-parameters

를 추가 명령줄 매개변수로 추가해줘야만 컴파일시 매개변수 이름을 자동 생성한다.

추가된 명령어로 다시 컴파일되어야함으로, 반드시 out폴더를 삭제해주자.

out폴더는 그림과 같이 설정하면 인텔리제이에서도 확인 가능하다.

이를 삭제해주고 다시 어플리케이션을 실행하면 옳바르게 컴파일되면서 자동 바인딩이 된다.