[Springboot #8] java.lang.IllegalArgumentException: Name for argument of type [long] not specified, and parameter name information not available via reflection.

0woy·2024년 9월 10일
0

에러

목록 보기
11/14

💣 문제

테스트 코드를 작성하고 실행했는데, 위와 같이 에러 발생

해당 테스트 코드는 url로 부터 id를 읽어와서 특정 게시글을 조회하는 테스트 코드이다
바로 구글링하니 나와 같은 문제 오천 오백만개.

문제 원인 Controller 코드

  • spring boot 3.2에서 발생하는 파라미터 이름 인식 문제라고 한다.
    스프링 부트 3.2부터 자바 컴파일러에 -parameters 옵션을 넣어주어야 애노테이션의 이름을 생략할 수 있다.

이 문제는 Build, Execution, Deployment -> Build Tools -> Gradle에서
Build and run using를 IntelliJ IDEA로 선택한 경우에만 발생

Gradle로 선택한 경우, Gradle이 컴파일 시점에 해당 옵션을 자동으로 적용함.
자바를 컴파일할 때 매개변수 이름을 읽을 수 있도록 남겨두어야 사용할 수 있음
컴파일 시점에 -parameters 옵션을 사용하면 매개변수 이름을 사용할 수 있게 남겨둔다.

스프링 부트 3.2 전까지는 바이트코드를 파싱해서 매개변수 이름을 추론하려고 시도했지만, 스프링 부트 3.2 부터는 이런 시도를 하지 않음!


📚 해결 방안

1. 이름 적어주기

애노테이션에 이름을 생략하지 않고, 항상 적어준다.

@RequestParam("username") String username

@PathVariable("userId") String userId

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

  1. IntelliJ IDEA에서 File -> Settings를 연다.

  2. Build, Execution, Deployment → Compiler → Java Compiler로 이동

  3. Additional command line parameters라는 항목에 -parameters 추가.

  4. out 폴더를 삭제하고 다시 실행한다. out 폴더를 삭제해야 다시 컴파일이 일어난다.

3. Gradle을 사용하여 빌드 & 실행


✨ 해결

참고- @PathVariable name 생략 질문 드립니다

0개의 댓글