스프링부트에서 API 처음 작성하다보면 여러 오류가 발생하기도 하는데..
이번경우에는 동작은 잘하나 실제 API 호출할때 발생한 오류이다.
한 번 어떤 오류인지 살펴보고 원인 및 해결방법을 찾아보도록 하겠다.
오류 메시지
java.lang.IllegalArgumentException: Name for argument of type [int] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag.
간략하게 오류 메시지를 보자면 다음 과 같다.
뭔가...[int] argument를 위한 이름이 특정되지 않았다는 거 같다.
그 뒤에는 -paramgers 플래그를 사용하라는 해결책도 제시하는 것으로 보인다.
API 내용
해당 api는 간단하게 GET 호출을 하는 api로 parameter는 2개를 받는 덧셈 api이다.
@GetMapping("/add")
public int addTwoNumbers(@RequestParam int number1, @RequestParam int number2){
return number1 + number2;
}
여기서 보면 parameter를 @RequestParam으로 2개 받고 있다.
원인
하지만 여기에 @RequestParam에 어떠한 명시도 하고 있지 않는데 이 경우 Requst Parameter의 값이 어떤 변수에 적용(?)되야 하는지 명시되어 있지 않아 발생한 문제로 보인다.
해결책 1
이 경우 간단하게 @RequstParam에 name을 설정해 주면 된다.
이렇게 Requst Parameter의 값이 어떤 변수에 저장되는지를 명시해주면 정상적으로 작동 되는 것을 볼 수있다.
@GetMapping("/add")
public int addTwoNumbers(@RequestParam(name = "number1") int number1, @RequestParam(name = "number2") int number2){
return number1 + number2;
}
그렇다면 위 name을 생략하는 방법은 없을까?(참고코드 등을 보면 생략되는 경우가 있던데?)
spring-boot 3.2 이상부터는 파라미터 이름 인식 문제가 있어 자바 컴파일러에 -parameters 옵션을 주어야 @Requstparam등 api의 requsest paramter의 이름을 생략 하여 작성 할 수가 있다.
해결책 2
- File - Settings
- Build, Execution, Deployment - Compiler - Java Compiler
- Additional command line parmeters에 -parameters 를 추가해준다.
- out 폴더를 삭제후 실행(다시 컴파일하기 위함)
해결책 3
Gradle 을 사용해서 빌드하고 실행해 준다.
하지만 저의 경우 개인적으로 명시적인게 좋아 Gradle을 사용해서 빌드하되 name을 직접적으로 명시해주는 것을 선호한다.
'공부방 > 스프링, 스프링부트' 카테고리의 다른 글
Build.gradle에서 dependency 추가하기 (0) | 2024.02.14 |
---|