DEV/Spring

[트러블슈팅] @ReqestParam, @PathVariable 사용 시 Name for argument of type [”type”] not specified 에러 해결

Bi3a 2024. 2. 19. 17:15

728x90

 

왜 안되는지는 모르겠고 왜 되는지는 더더욱 모르겠다.


문제 개요

@PathVariable, @RequestParam, @Param
등 클래스 파일에서 특정 name 혹은 value 속성을 바인딩할 파라미터를 선택적으로 바인딩할 때 발생하는 에러임

 

 

문제가 발생했던 API

엔드포인트

@GetMapping("/location/search")
	public ResponseEntity<List<ChargingStationSearchResponseDto>> searchStation(
		@RequestParam double swLat,
		@RequestParam double swLng,
		@RequestParam double neLat,
		@RequestParam double neLng
	) {
		return ResponseEntity.ok(
        chargingStationService.findByLatBetweenAndLngBetween(swLat, swLng, neLat, neLng));
	}

 

API Request

http://localhost:8090/api/v1/chargingStation/location/search?
	swLat=37.47796003321645&
	swLng=127.02408949227622&
	neLat=37.49349191883273&
	neLng=127.030562644692425

 

API Response

"statusCode": 500,
"trace": ["java.lang.IllegalArgumentException: 
Name for argument of type [double] not specified, 
and parameter name information not available via reflection. 
Ensure that the compiler uses the '-parameters' flag.", ...

 

 

원인 분석

1. 클래스 파일에서 해당 파라미터를 인식하지 못해서 발생한 문제이다.

  • 자바 8 이상에서  -parameters 컴파일 플래그를 사용 시 해당 상황에서 오류가 발생하지 않음
  • Response에도  -parameters  플래그를 사용하는지 확인하라 명시되어 있음

 

 

2. Gradle Build tool을 IntelliJ로 설정한 상태

  • IntelliJ로 빌드 시에는 -parameters 컴파일 플래그를 사용하지 않는다.
    • IntelliJ 빌드의 컴파일러는 Spring MVC와 같은 프레임워크에서 @RequestParam 사용 시 매개변수 이름이 없어서 컴파일러가 경고를 표시함
  • Gradle로 빌드 시에는 -parameters 컴파일 플래그를 사용한다.
    • Gradle의 빌드 스크립트는 @RequestParam 사용 시 메소드 매개변수 이름을 자동으로 바인딩을 해준다.

 

 

결론(해결 방법)

  • 1안 : IntelliJ 빌드 툴에서 -parameters 플래그를 사용하도록 설정한다.
    • 개인 설정으로 해결할 수 있는 방법이다.
  • 2안 : @RequestParam, @Pathvariable과 같은 어노테이션에서 value 속성을 명시적으로 지정한다.
    • 가장 보수적인 방법으로 개인의 빌드 툴을 IntelliJ / Gradle 지정유무 상관없이 해결할 수 있다.

 

value, defaultValue 다 설정해준다.

 

  • 3안 : 팀의 빌드 툴을 강제한다. (Gradle로 하던가 IntelliJ로 하던가)

 

 

# 작성 사유

클라이언트에서 작업 시 해당 500 에러가 터지면 서버에서 확인하지 않는 이상 원인 파악이 힘들어 작성하게 되었음.

 


틀린 부분이 있으면 댓글로 알려주세요!