Mapping 의 "경로"와 "변수명"이 같다면 name을 생략 가능하지만,
스프링 부트 3.2 파라미터 이름 인식 문제로 예외가 발생한다.
//GetMapping 경로의 {userId}, {orderId}와 @PathVariable의 변수명이 같다면 name 생략 가능
@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath(@PathVariable String userId, @PathVariable Long orderId) {
log.info("mappingPath userId={}, orderId={}", userId, orderId);
return "ok";
}
java.lang.IllegalArgumentException: Name for argument of type [java.lang.String] not specified, and parameter name information not found in class file either.
해결방법은
스프링 부트 3.2부터 자바 컴파일러에 -parameters 옵션을 넣어주어야 애노테이션의 이름을 생략할 수 있다.
Window : File > Settings > Build, Exceution, Deployment > Compiler > Java Compiler 에서 Additonal command line parameters에 -parameters 옵션 추가
문제 원인
참고로 이 문제는 Build, Execution, Deployment -> Build Tools -> Gradle에서
Build and run using를 IntelliJ IDEA로 선택한 경우에만 발생한다.
Gradle로 선택한 경우에는 Gradle이 컴파일 시점에 해당 옵션을 자동으로 적용해준다.
자바를 컴파일할 때 매개변수 이름을 읽을 수 있도록 남겨두어야 사용할 수 있다. 컴파일 시점에 -parameters 옵션을 사용하면 매개변수 이름을 사용할 수 있게 남겨둔다.
스프링 부트 3.2 전까지는 바이트코드를 파싱해서 매개변수 이름을 추론하려고 시도했다. 하지만 스프링 부트 3.2 부터는 이런 시도를 하지 않는다.
'Framework > Spring🌱' 카테고리의 다른 글
@Transactional 과 Rollback규칙 (feat. Checked Exception , Unchecked Exception) (1) | 2025.04.14 |
---|---|
[Spring]@RequiredArgsConstructor (0) | 2024.05.02 |
[Spring] @Autowired란? (0) | 2024.05.02 |
[Spring] MultiValueMap란? (0) | 2024.04.08 |
Di / IoC (0) | 2021.07.15 |