[Spring Boot] parameter name information not available 해결 (스프링의 파라미터 자동 매핑 실패)

손은실·3일 전
0

Spring Boot

목록 보기
1/13
post-thumbnail

이슈 배경

GET 요청 컨트롤러에서 @PathVariable을 통해 URL에서 값을 추출하는 메서드를 작성했습니다.

URL의 파라미터와 같은 이름의 메서드 파라미터를 작성했지만, 아래와 같은 에러가 발생했습니다.

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.

위 에러를 해석해보면,
"Long 타입인 인자의 이름이 분명하지 않다, 그리고 파라미터의 이름 정보를 사용할 수 없다." 라고 합니다.
그리고, '-parameters' 플래그를 컴파일러에 사용하라고 알려줍니다.



원인

Spring이 파라미터 이름을 못 찾았다

@PathVariable을 사용하면, Spring은 파라미터 이름을 자동으로 매핑하려고 시도합니다.
에러의 마지막 줄처럼 '-parameters' 플래그가 활성화되어 있으면, Spring이 파라미터 이름을 찾을 수 있습니다.

Spring이 매핑하지 못하면, @PathVariable(name = "bookId") 처럼 파라미터 이름을 명시해줘야 한다고 합니다.

이름을 명시하는 방법에 대해선 만족할 수 없었습니다.

실제 해결이 되지도 않았을 뿐더러, URL의 파라미터 이름과 메서드의 파라미터 이름이 동일하면 name 을 따로 기재하지 않아도 자동 매핑이 가능하기 때문입니다.


왜 이 메서드의 파라미터만 못 찾을까?

라는 의문이 들었습니다. 지금까지 동일한 방식으로 컨트롤러 메서드를 생성해왔기 때문입니다.

'메서드마다 컴파일러 플래그가 다르게 설정되나?' 싶었지만, 전체 프로젝트가 동일한 컴파일러 설정을 사용하므로, 일부 메서드에서만 이름을 찾지 못하는 경우는 코드 작성 시점의 차이와 IDE의 빌드 캐시 문제 일 수 있다는 것을 알게됐습니다.



해결

결론부터 말하자면,
컴파일러 '-parameters' 플래그 설정, @PathVariable의 name 명시 등의 방법을 시도하기 전에, 빌드 캐시 문제일 가능성을 생각해보자.


IDE의 캐시 무효화 (IntelliJ)

파일 > 캐시 무효화 으로 들어가서, 모든 캐시를 지우고 프로젝트를 다시 시작합니다.

처음에 에러가 발생했던 코드에서 변경 사항 없이 똑같이 실행했고, 정상적으로 파라미터를 찾아 실행에 성공했습니다.


새 메서드를 생성하기 전, 기존의 코드를 실행했을 때는 컴파일러에 플래그 설정이 잘 설정되어서 에러가 발생되지 않았을 것입니다.

새 메서드를 생성한 후에는 그동안 쌓인 빌드 캐시에서 어딘가 꼬여버려 에러가 발생한 것 같습니다.

post-custom-banner

0개의 댓글