Name for argument of type [java.lang.Integer] not specified (+ 프로젝트 실행 오류와 파라미터 인식 문제 해결)
- Name for argument of type [java.lang.Integer] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag.
- IntelliJ에서 Converter 테스트 중 발생한 오류
- 환경 및 버전: Mac OS, IntelliJ IDEA, Java 17, Spring Boot 3.2.1
- 서버 실행하여 맵핑한 url로 데이터를 넘기는데 파라미터를 제대로 인식하지 못한 것으로 보임 -> 매개변수 이름 인식 문제
오류 내용
Name for argument of type [java.lang.Integer] 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]
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.getNamedValueInfo(AbstractNamedValueMethodArgumentResolver.java:160) ~[spring-web-6.1.2.jar:6.1.2]
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:106) ~[spring-web-6.1.2.jar:6.1.2]
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122) ~[spring-web-6.1.2.jar:6.1.2]
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:226) ~[spring-web-6.1.2.jar:6.1.2]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:179) ~[spring-web-6.1.2.jar:6.1.2]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.1.2.jar:6.1.2]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:917) ~[spring-webmvc-6.1.2.jar:6.1.2]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:829) ~[spring-webmvc-6.1.2.jar:6.1.2]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.1.2.jar:6.1.2]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.1.2.jar:6.1.2]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.1.2.jar:6.1.2]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.1.2.jar:6.1.2]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.1.2.jar:6.1.2]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.17.jar:6.0]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.1.2.jar:6.1.2]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.17.jar:6.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.17.jar:10.1.17]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.1.2.jar:6.1.2]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.2.jar:6.1.2]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.1.2.jar:6.1.2]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.2.jar:6.1.2]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.1.2.jar:6.1.2]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.2.jar:6.1.2]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:340) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-10.1.17.jar:10.1.17]
오류 발생 부분
@ResponseBody
@GetMapping("/hello-v2")
public String helloV2(@RequestParam Integer data) {
System.out.println("data = " + data);
return "OK";
}
서버 실행 후 http://localhost:8080/hello-v2?data=19로 url을 입력하면 해당 오류가 발생하였다.
Parameter로 설정한 Integer의 값을 인식하지 못하고 있다.
`@RequestParam("data")`로 지정해주면 해결이 되지만, 원래 생략해도 되는 부분이라 다른 방법을 찾았다.
그리고 이전에는 파라미터명을 지정하지 않아도 이런 오류가 발생하지 않았었다..
찾아보니 이건 IntelliJ의 설정을 바꿔서 발생한 문제였는데,
Settings > Build, Execution, Deployment > Gradle에서 설정을 바꿔주니 해결이 되었다.
(아래 사진의 체크된 부분을 IntelliJ에서 Gradle로 변경)
Gradle과 IntelliJ의 빌드 설정이 많이 다른 것 같다.
예전에 Gradle의 버전이 맞지 않는다는 경고 메시지를 없애려고 IntelliJ로 변경했었는데 다시 Gradle로 돌아옴.. :(
둘 다 해결할 수 있는 방법을 따로 찾아봐야겠다.
+ 새로운 오류 발생 및 해결 방법 추가!
빌드 방식에 따라 계속 이런 저런 오류가 발생해서 근본적인 해결방법을 찾아냈다.
설정을 이것 저것 바꾸다 보니 프로젝트가 실행되지 않게 되었고
심지어 아예 새로운 프로젝트를 생성해서 빌드해도 실행이 되지 않았다..
새로운 오류 내용(프로젝트 실행 안됨)
Execution failed for task ':TypeconverterApplication.main()'.
> Process 'command 'C:\Program Files\Java\jdk-17\bin\java.exe'' finished with non-zero exit value 1
* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.
Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.
You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.
For more on this, please refer to https://docs.gradle.org/8.5/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.
이건 Gradle로 빌드했을 때만 발생하고 IntelliJ로 빌드하면 실행이 잘 되었다. 도대체 왜..?
어쨌든 이러한 이유로 IntelliJ로 빌드하되 파라미터 이름 인식이 잘 되도록 설정하는 방법이 필요했다.
파라미터 인식 문제의 원인과 해결방안
스프링 부트 3.2부터 파라미터의 이름을 인식하지 못하는 문제가 있다고 한다.
그 전까지는 바이트코드를 파싱하여 매개변수 이름을 추론하려고 했지만, 3.2부터 그 방식이 변경되었다.
그래서 `@RequestParam`, `@PathVariable` 등의 애너테이션을 사용할 때
이름을 지정하지 않으면 인식이 되지 않아 오류가 발생하는 것이다.
IntelliJ IDEA > Settings > Build, Execution, Deployment > Compiler > Java Compiler 로 이동하여
Additional command line parameters 항목에 -parameters
를 입력하여 적용한다.
그 후 해당 프로젝트 폴더에 있는 out 폴더를 삭제한 후 다시 실행한다.(중요! 삭제하지 않으면 여전히 인식 안됨)
이제 정상적으로 실행되며 파라미터 이름을 지정하지 않아도 잘 인식되는 것을 확인할 수 있다.
별 거 아닌 문제 같았는데 해결하는데 시간이 오래 걸렸다 ㅠㅠ
검색했을 때 `-parameters`를 입력하면 된다는 글은 많이 봤는데
out 폴더를 삭제하지 않아 계속 해결이 되지 않았었다. 반드시 삭제해야 한다!
나와 같은 문제를 겪는 사람들에게 도움이 되길 바란다. 다들 행복코딩하세요..
'Programming > Solving Errors' 카테고리의 다른 글
[JPA] LazyInitializationException 문제 해결하기 (0) | 2024.03.04 |
---|---|
[H2] Column "start_value" not found 오류 해결 (0) | 2024.02.08 |
[Spring Boot] PermittedSubclasses requires ASM9 에러 (0) | 2023.12.26 |
Java HotSpot(TM) 64-Bit Server VM warning 해결 (0) | 2023.12.11 |
Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0. (0) | 2023.12.11 |
Liked this Posting!