Spring

[Spring] java.lang.IllegalArgumentException: Name for argument of type [java.lang.Long] not specified, and parameter name information not available via reflection.

lala9663 2024. 2. 6. 20:41

jakarta.servlet.ServletException: Request processing failed: java.lang.IllegalArgumentException: Name for argument of type [java.lang.Long] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag.

테스트 코드를 돌리고 있는데 갑자기 이런 오류가 나왔다.. 갑자기 처음 보는 오류가 나와서 당황,, 

 

해석을 해보니 파라미터를 못찾는 문제 같은데 왜 갑자기 이런 오류가 나왔는지 궁금하다. 

김영한 님께서 이와 유사한 질문에 대한 글에 답을 이미 해 주신 상태였다. 역시 갓

 

해결방법이 총 3가지가 있다고 한다.

 

1. 애노테이션 생략 X

 

스프링 부트 3.2부터 자바 컴파일러에 -parameters 옵션을 넣어주어야 애노테이션의 이름을 생략할 수 있다고 한다.

@RequestMapping("/request")
public String request(@RequestParam("username") String username) {
   ...
}

 

이런 식으로 

 

원래 요청 파라미터의 이름과 메서드의 매개변수 이름이 일치하지 않을 때 명시적으로 파라미터의 이름을 지정해줘야 하고 매개변수 이름과 요청 파라미터의 이름이 동일하면 생략할 수 있는데  어찌 된 거지,,,

 

2. 컴파일 시점에 -parameters 옵션 적용

 

  1. IntelliJ IDEA에서 File -> Settings를 연다. (Mac은 IntelliJ IDEA -> Settings)
  2. Build, Execution, Deployment → Compiler → Java Compiler로 이동한다.
  3. Additional command line parameters라는 항목에 다음을 추가한다.
    -parameters
  4. out 폴더를 삭제하고 다시 실행한다. 꼭 out 폴더를 삭제해야 다시 컴파일이 일어난다.

근데 나는 Java Compiler에  Additional command line parameters 이 항목이 보이지 않아서 이 방법은 패스,,

 

3. 빌드를 Grdle 방식으로

 

빌드를 할 때 gradle방식과 IntelliJ IDEA 방식이 있는데 나는 Intelli IDEA 방식을 사용하고 있다. 

Gradle로 선택하면 컴파일 시점에서 해당 옵션을 자동으로 적용해 준다.

 

변경하는 방법은 Settings -> Build, Execution, Deployment -> Build Tools -> Gradle

 

나는

코드의 변경을 굳이 하고 싶지 않아서 3번 방식으로 문제를 해결

 

 

 

 

참고자료: 인프런 질문