본문 바로가기
Develop/Spring+JPA

[Spring] NestedServletException - Name for argument type [java.lang.Long] not available 에러

by 연로그 2022. 1. 28.
반응형

org.springframework.web.util.NestedServletException: Request processing failed; java.lang.IllegalArgumentException: Name for argument type [java.lang.Long] not available, and parameter name information not found in class file either. 에러

parameter name information, 파라미터 이름에 대한 정보를 찾지 못하는 문제이다.

postman으로 테스트했을 때는 문제가 없었으나 테스트 코드를 작성하니 위 에러가 발생했다.

 

방법1

👉 컨트롤러에서 파라미터 이름에 대한 정보만 추가

 

테스트 코드

굉장히 간단한 구조이다.

get 메소드로 url에 접근하고 서버 응답 status가 200 성공인지 확인한다.

@Test
public void 내_정보_조회() throws Exception {
    Long id = 1L;
    String url = "/users/" + id;
    mvc.perform(get(url))
            .andExpect(status().isOk());
}

 

Controller (수정 전)

@ResponseBody
@GetMapping("/users/{id}")
public UserResponseDto myPage(@PathVariable Long id) {
    return userService.findByUserId(id);
}

 

Controller (수정 후)

@PathVariable에서 name을 지정해주었다.

@ResponseBody
@GetMapping("/users/{id}")
public UserResponseDto myPage(@PathVariable(name = "id") Long id) {
    return userService.findByUserId(id);
}

 

결과 화면

 

방법 2

위 방법에 대해 의문이 드는 사람이 많을 것이다.

name과 변수명이 동일한 경우에는 생략 가능하지 않나?

컴파일 시에는 debugging enabled가 되어야 스프링이 찾을 수 있다.

 

The matching of method parameter names to URI Template variable names can only be done if your code is compiled with debugging enabled. If you do have not debugging enabled, you must specify the name of the URI Template variable name to bind to in the @PathVariable annotation.

 

이에 대해서는 해결 방법을 찾으면 추가하겠다. TODO


참고

  1. StackOverflow: https://stackoverflow.com/questions/25797584/name-for-argument-type-java-lang-string-not-available-and-parameter-name-info
  2. Spring doc: https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch18s02.html
  3. bluesky10님 블로그: https://blusky10.tistory.com/386
반응형