IT/WEB

[JAVA] 에러 java.lang.NoSuchMethodError 에러 메세지가 뜰 때..

오달달씨 2021. 3. 12. 12:39
728x90
반응형

회사에서 작업하다 해당 에러를 맞딱뜨렸다. 

java.lang.NoSuchMethodError 오류는 해당 메서드를 찾지 못할 때 발생한다.

3월 08, 2021 1:44:14 오후 org.apache.catalina.core.StandardWrapperValve invoke
심각: Servlet.service() for servlet [practice] in context with path [] threw exception [Handler processing failed; nested exception is java.lang.NoSuchMethodError: com.practice.service.MsgboxService.getMsgBatchHistDetail(Ljavax/servlet/http/HttpSession;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;)Lorg/springframework/web/servlet/ModelAndView;] with root cause
java.lang.NoSuchMethodError: com.service.MsgboxService.getMsgBatchHistDetail(Ljavax/servlet/http/HttpSession;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;)Lorg/springframework/web/servlet/ModelAndView;
        at com.controller.MsgboxController.getMsgBatchHistDetail(MsgboxController.java:57)
        at com.controller.MsgboxController$$FastClassByCGLIB$$e325d1f7.invoke(<generated>)
        at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
        at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:689)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
        at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:80)
        at kr.co.mirisoft.mmsgw.aop.LoginAspect.msgboxControllerCheckLoginSession(LoginAspect.java:344)
        at sun.reflect.GeneratedMethodAccessor143.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:621)
        at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:610)
        at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:65)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
        at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
        at kr.co.mirisoft.mmsgw.controller.MsgboxController$$EnhancerByCGLIB$$bb7b4384.getMsgBatchHistDetail(<generated>)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at com.util.CrossScriptingFilter.doFilter(CrossScriptingFilter.java:30)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:615)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1775)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1734)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)

메소드를 찾지 못하는 경우는 무엇이 있을까? 해당 오류는 단순하게 생각하면 금방 해결할 수 도 있는 오류이다.

반응형

1. 메소드가 없는 경우

2. 단순 타이핑 오류
3. 매개변수가 일치하지 않는 경우
--> 이 경우에는 메소드를 수정하는 것으로 쉽게 해결이 가능하다.

 

반면 1,2,3번의 경우에도 해당하지 않는 경우
클래스, jar 정상적으로 올라가있는 지 확인, javap 명령을 이용해 메소드의 존재를 확인해보자. 

그럼에도 이상이 없다면 다음의 경우를 의심해보자.

 

4. 내부에서 참조하는 lib이 빠진 경우

5. classpath 상에서 중복되는 class가 있어 정상적으로 method를 찾지 못해서 발생

--> 중복되는 jar 파일에서 존재 확인

--> pom.xml 파일에서 dependency 부분에서 충돌이 발생되는 라이브러리 확인 

728x90

결론 :  나의 경우는 3번의 경우였다... 이전 관리자가 넘겨준 소스와 상용에 올라간 소스의 메소드 매개변수의 차이가 있었는데 그것을 모르고 Service 단만 수정하여 Controller 단에서 문제가 생긴듯 하다. 이렇듯... 이력관리는 매우 중요하다. 지금부터라도 내가 관리하는 소스는 사내 GIT을 통해 제대로 이력 및 소스를 관리해야하겠다.

728x90
반응형