[spring boot] 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.

프헤이·2024년 1월 28일
0

오늘의 에러

목록 보기
5/6

🚨status 500 Internal Server Error가 떴다🚨

서버 로그를 확인해보니

2024-01-28T12:01:31.634+09:00  INFO 20960 --- [nio-8081-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-01-28T12:01:31.634+09:00  INFO 20960 --- [nio-8081-exec-2] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2024-01-28T12:01:31.634+09:00 DEBUG 20960 --- [nio-8081-exec-2] o.s.web.servlet.DispatcherServlet        : Detected StandardServletMultipartResolver
2024-01-28T12:01:31.634+09:00 DEBUG 20960 --- [nio-8081-exec-2] o.s.web.servlet.DispatcherServlet        : Detected AcceptHeaderLocaleResolver
2024-01-28T12:01:31.634+09:00 DEBUG 20960 --- [nio-8081-exec-2] o.s.web.servlet.DispatcherServlet        : Detected FixedThemeResolver
2024-01-28T12:01:31.635+09:00 DEBUG 20960 --- [nio-8081-exec-2] o.s.web.servlet.DispatcherServlet        : Detected org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator@662e5590
2024-01-28T12:01:31.635+09:00 DEBUG 20960 --- [nio-8081-exec-2] o.s.web.servlet.DispatcherServlet        : Detected org.springframework.web.servlet.support.SessionFlashMapManager@72a61e61
2024-01-28T12:01:31.636+09:00 DEBUG 20960 --- [nio-8081-exec-2] o.s.web.servlet.DispatcherServlet        : enableLoggingRequestDetails='false': request parameters and headers will be masked to prevent unsafe logging of potentially sensitive data
2024-01-28T12:01:31.636+09:00  INFO 20960 --- [nio-8081-exec-2] o.s.web.servlet.DispatcherServlet        : Completed initialization in 2 ms
2024-01-28T12:01:31.649+09:00 DEBUG 20960 --- [nio-8081-exec-2] o.s.web.servlet.DispatcherServlet        : GET "/board/1", parameters={}
2024-01-28T12:01:31.675+09:00 DEBUG 20960 --- [nio-8081-exec-2] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to com.example.backend.web.BoardController#getBoard(Long)
2024-01-28T12:01:31.677+09:00 DEBUG 20960 --- [nio-8081-exec-2] o.j.s.OpenEntityManagerInViewInterceptor : Opening JPA EntityManager in OpenEntityManagerInViewInterceptor
2024-01-28T12:01:31.711+09:00 DEBUG 20960 --- [nio-8081-exec-2] o.s.web.method.HandlerMethod             : Could not resolve parameter [0] in public com.example.backend.web.dtos.BoardDto com.example.backend.web.BoardController.getBoard(java.lang.Long): 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.
2024-01-28T12:01:31.719+09:00 DEBUG 20960 --- [nio-8081-exec-2] o.j.s.OpenEntityManagerInViewInterceptor : Closing JPA EntityManager in OpenEntityManagerInViewInterceptor
2024-01-28T12:01:31.719+09:00 DEBUG 20960 --- [nio-8081-exec-2] o.s.web.servlet.DispatcherServlet        : Failed to complete request: 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.
2024-01-28T12:01:31.720+09:00 ERROR 20960 --- [nio-8081-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [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.] with root cause

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.
	at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.updateNamedValueInfo(AbstractNamedValueMethodArgumentResolver.java:185) ~[spring-web-6.1.2.jar:6.1.2]
...

2024-01-28T12:01:31.738+09:00 DEBUG 20960 --- [nio-8081-exec-2] o.s.web.servlet.DispatcherServlet        : "ERROR" dispatch for GET "/error", parameters={}
2024-01-28T12:01:31.739+09:00 DEBUG 20960 --- [nio-8081-exec-2] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#error(HttpServletRequest)
2024-01-28T12:01:31.739+09:00 DEBUG 20960 --- [nio-8081-exec-2] o.j.s.OpenEntityManagerInViewInterceptor : Opening JPA EntityManager in OpenEntityManagerInViewInterceptor
2024-01-28T12:01:31.782+09:00 DEBUG 20960 --- [nio-8081-exec-2] o.s.w.s.m.m.a.HttpEntityMethodProcessor  : Using 'application/json', given [*/*] and supported [application/json, application/*+json]
2024-01-28T12:01:31.785+09:00 DEBUG 20960 --- [nio-8081-exec-2] o.s.w.s.m.m.a.HttpEntityMethodProcessor  : Writing [{timestamp=Sun Jan 28 12:01:31 KST 2024, status=500, error=Internal Server Error, path=/board/1}]
2024-01-28T12:01:31.885+09:00 DEBUG 20960 --- [nio-8081-exec-2] o.j.s.OpenEntityManagerInViewInterceptor : Closing JPA EntityManager in OpenEntityManagerInViewInterceptor
2024-01-28T12:01:31.890+09:00 DEBUG 20960 --- [nio-8081-exec-2] o.s.web.servlet.DispatcherServlet        : Exiting from "ERROR" dispatch, status 500

✅주요 문제는 BoardController.getBoard(java.lang.Long) 메소드에서 발생하고 있었다.

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.

💊나의 코드에서 이 문제를 해결하려면 2가지 방법이 있다.

1. IntelliJ IDEA의 컴파일러 설정에 -parameters 플래그를 추가

2. @PathVariable 애너테이션에 명시적으로 변수 이름을 지정

나는 2번째 방법으로 해결했다.

🙅befor🙅

@GetMapping("/board/{id}")
    public BoardDto getBoard(@PathVariable Long id) {
        return boardService.getBoard(id);
    }

🙆after🙆

@GetMapping("/board/{id}")
    public BoardDto getBoard(@PathVariable("id") Long id) {
        return boardService.getBoard(id);
    }

이렇게 하면 @PathVariable 애너테이션은 URL 경로의 {id} 부분을 id라는 이름의 Long 타입 매개변수에 바인딩한다.


데이터를 잘 받아온다👍

@RequestParam 애너테이션을 메소드 매개변수에 추가하는 방법도 있지만 나의 코드에서는 적절한 방법이 아니라서 이용하지 않았다.

나의 기존 코드는 URL 경로의 일부로 전달되는 id 값을 처리하기 위해 @PathVariable 애너테이션을 사용하고 있다. 그런데 @RequestParam은 주로 쿼리 파라미터를 처리할 때 사용된다.

예를 들어, /board?id=123 형태의 URL에 대해 id 쿼리 파라미터를 처리하려면 @RequestParam을 사용할 수 있다. 하지만 /board/123 형태의 URL에서 123 부분을 처리하려면 @PathVariable을 사용하는 것이 맞다.

현재 코드를 유지하되 컴파일러가 메소드 매개변수의 이름을 유지하도록 설정하려면, IntelliJ IDEA의 컴파일러 설정에 -parameters 플래그를 추가하는 방법을 쓰면 된다.

profile
개발의 체험현장

0개의 댓글