반응형
1️⃣ 문제 상황
Spring 관련 공부 도중 발생한 에러이다.
해당 에러는 '@RequestParam', '@PathVariable' 애노테이션을 사용할 때 발생할 수 있다.
아래는 에러 메시지 내용 중 일부이다.
2️⃣ 원인 분석
java.lang.IllegalArgumentException: Name for argument of type [java.lang.String] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag.
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.updateNamedValueInfo(AbstractNamedValueMethodArgumentResolver.java:185) ~[spring-web-6.1.2.jar:6.1.2]
이를 해석해보면 String 타입의 매개 변수 이름이 지정되지 않았다는 것이다.
아래는 문제가 된 코드이다.
@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath(@PathVariable String userId, @PathVariable Long orderId) {
log.info("mappingPath userId = {}, orderId = {}", userId, orderId);
return "ok";
}
위 경우에 '@PathVariable' 대신 '@RequestParam'을 사용해도 똑같은 결과가 나올 것이다.
해결 방법은 의외로 간단하며, 두 가지가 있다.
3️⃣ 해결 방법
1) 애노테이션에 명확한 속성 부여
말 그대로 애노테이션에 명확한 속성을 부여하는 방법이다.
매개 변수 이름이 지정되지 않았던 문제를 해결할 수 있는 가장 직관적인 방법이라고 할 수 있겠다.
속성에는 'name' 또는 'value'가 들어가며, 이는 생략하고 매개 변수명만 넣어도 된다.
@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath (
@PathVariable("userId") String userId,
@PathVariable("orderId") Long orderId
) {
log.info("mappingPath userId = {}, orderId = {}", userId, orderId);
return "ok";
}
}
또는
@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath (
@PathVariable(value = "userId") String userId,
@PathVariable(value = "orderId") Long orderId
) {
log.info("mappingPath userId = {}, orderId = {}", userId, orderId);
return "ok";
}
}
2. 컴파일 시점에 '-parameters' 옵션 적용
Spring boot 3.2부터 자바 컴파일러에 '-parameters' 옵션을 넣어야 애노테이션 이름을 생략할 수 있다고 한다.
따라서 컴파일 시점에 해당 옵션을 적용하도록 설정하면 된다.
1) IntelliJ 옵션 적용 (Mac 기준)
- IntelliJ IDEA -> Settings
- Build, Execution, Deployment -> Complier -> Java Compiler (해당 단어로 검색하면 나온다.)
- Additional command line parameters 항목에 '-parameters' 추가
- out 폴더 삭제 후 재실행
2) build.gradle 옵션 적용
compileJava {
options.compilerArgs << '-parameters'
}
build.gradle 에 위 코드 삽입 후 업데이트
참고
인프런 김영한님 강의 - 스프링 MVC 1편
반응형